我对节点是新手,我正在构建rest节点and。我使用express和JWT进行身份验证。每当我用头'x-auth‘请求/节点/me时。它给出了错误,如下所示。我已经在/node/me中设置了中间件,用于查询mogodb数据库。它发现用户使用报头“x-auth”。
server.js:
var env = process.env.NODE_ENV || 'development';
if (env === "development") {
process.env.PORT = 3000;
process.env.MONGODB_URI = 'mongodb://localhost:27017/TodoApp';
} else if (env === "test") {
process.env.PORT = 3000;
process.env.MONGODB_URI = 'mongodb://localhost:27017/TodoAppTest';
}
var _ = require('lodash');
var express = require('express');
var bodyParser = require('body-parser');
var {ObjectID} = require('mongodb');
var app = express();
var {mongoose} = require('./db/mongoose');
var {Todo} = require('./models/todo');
var {User} = require('./models/user');
const {authenticate} = require('./middleware/authenticate');
const bcrypt = require('bcryptjs');
const port = process.env.PORT;
app.use(bodyParser.json());
app.get('/users/me',authenticate,(req,res) => {
res.send(req.user);
});
module.exports = {
app,
env
}
app.listen(port,() => {
console.log(`server is running ${port}`);
});authenticate.js:
const {User} = require('./../models/user');
var authenticate = (req,res,next) => {
var token = req.header('x-auth');
User.findByToken(token).then((doc) => {
if (!doc) {
res.status(401).send('doc is not found');
}
req.token = token;
req.user = doc;
next();
}).catch((e) => {
res.status(401).send(e);
});我收到了关于标头的错误
Error: Can't set headers after they are sent.
at validateHeader (_http_outgoing.js:494:11)
at ServerResponse.setHeader (_http_outgoing.js:501:3)
at ServerResponse.header (C:\Users\Yash\Desktop\node-api\node_modules\express\lib\response.js:719:10)
at ServerResponse.send (C:\Users\Yash\Desktop\node-api\node_modules\express\lib\response.js:164:12)
at app.get (C:\Users\Yash\Desktop\node-api\server\server.js:254:5)
at Layer.handle [as handle_request] (C:\Users\Yash\Desktop\node-api\node_modules\express\lib\router\layer.js:95:5)
at next (C:\Users\Yash\Desktop\node-api\node_modules\express\lib\router\route.js:131:13)
at User.findByToken.then (C:\Users\Yash\Desktop\node-api\server\middleware\authenticate.js:19:2)
at <anonymous>
at process._tickCallback (internal/process/next_tick.js:188:7)发布于 2018-05-06 06:17:58
您必须更改为:
if(!doc) {
res.status(401).send('doc is not found');
} else {
req.token = token;
req.user = doc;
next();
}原因是在执行if内部代码之后,如果您发送响应,则流将独立地继续,因为它只是一个函数调用。因此,您正在执行错误代码,然后执行成功代码,我指的是下一个函数,例如,如果文档存在,并且在执行next()时,响应已经发送。
致以敬意,
发布于 2018-05-06 06:19:18
你只能用快件发送一个回复。如果您遵循您的身份验证中间件中的一系列事件,您将发现您正在发送一个响应:
res.status(401).send('doc is not found');然后打电话给next()。当您调用next时,它将控制权传递给下一个中间件,然后该中间件发送:
res.send(req.user);当请求失败时,请将next()从循环中删除,如下所示:
if(!doc){
res.status(401).send('doc is not found');
return;
}发布于 2018-05-06 07:12:56
您必须导出身份验证。再加上回报
if(!doc) {
res.status(401).send('doc is not found');
return;
}或者添加其他
if(!doc) {
res.status(401).send('doc is not found');
} else {
req.token = token;
req.user = doc;
next();
}https://stackoverflow.com/questions/50196718
复制相似问题