node express Cannot set headers after they are sent to the client
下面的代码nodejs +express出错如何解决
app.get("/login"路由中最后的next()那句去掉。next会执行下一个中间件代码,由于没有下一个中间件可以执行,会走404错误处理输出错误响应。这样和异步查询数据的sendRes重复了。
根据提供的参考资料,无法确定正在使用哪个版本的NodeJS和Express框架,因为代码没有明确指定版本信息。以下代码是部署静态资源的示例:
const express = require('express');
const app = express();
app.use(express.static('./build'));
app.listen(8000, () => {
console.log("静态服务器启动成功~");
})
其中 express.static
是用来静态资源的方法,将 ./build
目录下的静态资源部署到服务器上,该服务运行在 8000 端口上。
关于请求解析和处理参数的部分,以下是部分示例代码:
通过参数传递:
app.use('/login/:id/:name', (req, res, next) => { // 定义路由路径,:id和:name是参数
console.log(req.params); // 可以通过req.params获取参数信息
res.json("请求成功~");
})
通过url查询字符串传递:
app.use('/login', (req, res, next) => {
console.log(req.query); // 可以通过req.query获取参数信息
res.json("请求成功~");
})
通过POST请求中的body的JSON格式传递:
自己编写中间件来解析JSON:
app.use((req, res, next) => {
if (req.headers['content-type'] === 'application/json') {
req.on('data', (data) => {
const userInfo = JSON.parse(data.toString());
req.body = userInfo;
})
req.on('end', () => {
next();
})
} else {
next();
}
})
app.post('/login', (req, res, next) => {
console.log(req.body);
res.end("登录成功~");
});
也可以使用Express内置的中间件或者使用body-parser来完成:
app.use(express.json());
app.post('/login', (req, res, next) => {
console.log(req.body);
res.end("登录成功~");
});
通过POST请求中的body的x-www-form-urlencoded格式传递:
可以使用Express自带的 urlencoded
函数来作为中间件:
app.use(express.urlencoded({extended: true}));
app.post('/login', (req, res, next) => {
console.log(req.body);
res.end("登录成功~");
});
通过POST请求中的form-data格式传递:
通过any借助multer去解析一些form-data中的普通数据:
app.use(upload.any());
app.use('/login', (req, res, next) => {
console.log(req.body);
});
关于错误处理方式,以下是示例代码:
app.use((req, res, next) => {
next(new Error("USER DOES NOT EXISTS"));
});
app.use((err, req, res, next) => {
const message = err.message;
switch (message) {
case "USER DOES NOT EXISTS":
res.status(400).json({message})
}
res.status(500)
})
其中,第一个中间件会调用 next()
将控制权传递给下一个中间件,同时抛出 "USER DOES NOT EXISTS" 的错误。第二个中间件用来处理错误,判断错误信息,并给出相应的响应结果。如果错误信息是 "USER DOES NOT EXISTS",则返回 400 状态码,否则返回 500 状态码。
需要注意的是,在请求过程中如果出现错误,在正确地处理完之后需要将错误信息传递给下一个中间件,否则会出现请求挂起的情况。