遵循YouTube教程编写Todo项目代码(含本地服务配置)却无法运行,求助
你的Todo应用无法运行的核心问题及修复方案
先帮你梳理代码里几个关键的问题,一步步来修复:
1. 原生HTTP服务器与Express的冲突
你手动添加了原生http模块创建服务器,但Express框架本身已经封装了HTTP服务器的功能,同时启动两个服务器会导致端口占用或者服务异常。完全可以移除原生http的代码,用Express自带的app.listen()来启动服务。
2. 模板字符串语法错误
你原来的console.log用了单引号包裹模板字符串,模板字符串必须用**反引号()**才能解析${}`变量,否则会直接输出字符串内容。
3. 缺少表单解析中间件
你的todoController里有POST路由,但没有处理表单提交的请求体,需要添加express.urlencoded()中间件来解析表单数据(因为你用的是传统表单提交)。
4. 静态文件路径优化
你设置app.use(express.static('./'))会把整个项目目录暴露为静态资源,存在安全风险,建议只指定Public文件夹作为静态资源目录,这样更规范。
修复后的完整代码:
app.js
var express = require('express'); var todoController = require('./todoController'); var app = express(); // 解析表单请求体 app.use(express.urlencoded({ extended: true })); app.set('view engine', 'ejs'); // 只暴露Public文件夹作为静态资源 app.use(express.static('./Public')); todoController(app); // 用Express自带的listen启动服务 const hostname = '127.0.0.1'; const port = 3000; app.listen(port, hostname, () => { // 用反引号包裹模板字符串 console.log(`Server running at http://${hostname}:${port}/`); });
todo.ejs
调整CSS路径(因为静态资源指向了Public文件夹,所以直接写/styles.css即可):
<html> <head> <title>Todo List</title> <script src="https://code.jquery.com/jquery-3.4.1.min.js" integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo=" crossorigin="anonymous"></script> <link href="/styles.css" rel="stylesheet" type="text/css"> </head> <body> <div id="todo-table"> <form action="/todo" method="POST"> <input type="text" name="item" placeholder="Add new item..." required /> <button type="submit">Add Item</button> </form> <ul> <li>Item 1</li> <li>Item 2</li> <li>Item 3</li> </ul> </div> </body> </html>
todoController.js(可选:添加POST请求的基础处理)
module.exports = function(app) { app.get('/todo', function(req, res){ res.render('todo'); }); // 处理表单提交的POST请求 app.post('/todo', function(req, res){ console.log('收到新的todo项:', req.body.item); // 这里可以后续添加保存到数据库的逻辑 res.redirect('/todo'); // 重定向回todo页面 }); app.delete('/todo', function(req, res){ // 后续实现删除逻辑 res.send('删除请求已接收'); }); };
运行步骤:
- 确保已经安装了依赖:
npm install express ejs - 启动服务:
node app.js - 访问
http://127.0.0.1:3000/todo就能看到你的Todo页面了
内容的提问来源于stack exchange,提问作者Mike Kim
相关产品推荐
相关产品推荐

