- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
首先,我阅读了所有其他 StackOverflow 答案和 GitHub 问题,但它们似乎都没有解决我的问题。使用以下代码(其中一些已被弃用,对于脏代码表示抱歉):
var express = require('express');
var fs = require('fs');
var path = require('path');
var parser = require('body-parser');
//Initializing the Express Framework
const app = express();
const mongoose = require('mongoose');
const uuidv4 = require ('uuid/v4');
var jose = require('node-jose');
var secureRandom = require('secure-random');
var bcrypt = require('bcrypt');
const jwt = require('express-jwt');
const jwt2 = require('jsonwebtoken');
var userSchema = new mongoose.Schema({
username: {type:String,unique:true},
password: String
},{timestamps:true})
var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/";
var signingKey = secureRandom(256, {type: 'Buffer'});
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
// Add headers
app.use(function (req, res, next) {
res.removeHeader('X-Powered-By');
res.setHeader('Access-Control-Allow-Origin', 'http://localhost:4200');
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');
res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type,Authorization');
res.setHeader('Access-Control-Allow-Credentials', true);
next();
});
var claims = {
iss: "http://example.com/", // The URL of your service
sub: "users/admin1", // The UID of the user in your system
name: "User Name",
scope: "self, admins"
}
userSchema.pre('save', function (next) {
var user = this;
if (!user.isModified('password')) {return next()};
bcrypt.hash(user.password,10).then((hashedPassword) => {
user.password = hashedPassword;
next();
})
}, function (err) {
next(err);
})
userSchema.methods.comparePassword=function(candidatePassword,next){ bcrypt.compare(candidatePassword,this.password,function(err,isMatch){
if(err) return next(err);
next(null,isMatch)
})
}
module.exports = mongoose.model("user", userSchema);
function protectRoute(req,res,next){
// if user exists the token was sent with the request
if(req.user){
//if user exists then go to next middleware
next();
}
// token was not sent with request send error to user
else{
res.status(500).json({error:'login is required'});
}
}
/* app.get('/protected',
jwt({secret: 'shhhhhhared-secret'}),
function(req, res) {
if (!req.user.admin) return res.sendStatus(401);
res.sendStatus(200);
}); */
MongoClient.connect(url, {
useUnifiedTopology: true,
useNewUrlParser: true,
},function(err, db) {
if (err) throw err;
var dbo = db.db("demo");
dbo.collection("demo").find({}).toArray(function(err, result) {
if (err) throw err;
console.log(result);
db.close();
});
});
readJsonFile = function(fname, res) {
fs.readFile(fname, 'utf8', function (err,data) {
if (err) {
console.log(err);
}
res.send(data.toString().replace(/\n|\r/g,''));
});
}
app.get('/', function (req, res) {
res.send('Hello World!');
});
app.get('/users', function (req, res) {
MongoClient.connect(url, {
useUnifiedTopology: true,
useNewUrlParser: true,
},function(err, db) {
if (err) throw err;
var dbo = db.db("demo");
dbo.collection("users").find({}).toArray(function(err, result) {
if (err) throw err;
res.send(result);
db.close();
});
});
console.log("GET UserCollection from MongoDB");
});
app.post('/users/:id', verifyToken, function (req, res){
jwt2.verify(req.token, 'secretkey', (err, auth) =>{
if(err){
res.sendStatus(403);
} else {
res.json({
message: 'User created (in theory)',
authData
})
}
})
res.json({
message: 'User created (in theory)2'
})
});
app.post('/api/login', function (req, res){
// Mock user TODO: implement proper BackEnd!
const user = {
id:1,
username:'brad',
email: 'brad@gmail.com'
}
jwt2.sign({user}, 'secretkey', { expiresIn: '1h'}, (err, token) =>{
res.json({
token
});
});
});
app.get('/user', function (req, res) {
readJsonFile('user.json', res);
console.log("GET User");
});
// FORMAT OF TOKEN
// Authorization: Bearer <access_token>
// Verify Token
function verifyToken(req, res, next){
// Get auth header value
const bearerHeader = req.headers['authorization'];
// Check if bearer is undefined
if(typeof bearerHeader !== 'undefined'){
// Split at the space
const bearer = bearerHeader.split(' ');
// Get token from array
const bearerToken = bearer[1];
// Set the token
req.token = bearerToken;
// Next middleware
next();
res.json({message: "Login successful"});
}
else{
// Forbidden
res.sendStatus(403);
next();
}
}
app.listen(3000, function () {
console.log('Listening on port 3000!');
});
if(process.env.NODE_ENV !== 'production') {
process.once('uncaughtException', function(err) {
console.error('FATAL: Uncaught exception.');
console.error(err.stack||err);
setTimeout(function(){
process.exit(1);
}, 100);
});
}
运行应用程序并发布 URL/users/5 后,出现以下错误并且应用程序崩溃:
Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
at ServerResponse.setHeader (_http_outgoing.js:485:11)
at Array.write (C:\Users\User\Documents\Project\Project2\node_modules\finalhandler\index.js:285:9)
at listener (C:\Users\User\Documents\Project\Project2\node_modules\on-finished\index.js:169:15)
at onFinish (C:\Users\User\Documents\Project\Project2\node_modules\on-finished\index.js:100:5)
at callback (C:\Users\User\Documents\Project\Project2\node_modules\ee-first\index.js:55:10)
at IncomingMessage.onevent (C:\Users\User\Documents\Project\Project2\node_modules\ee-first\index.js:93:5)
at IncomingMessage.emit (events.js:215:7)
at endReadableNT (_stream_readable.js:1183:12)
at processTicksAndRejections (internal/process/task_queues.js:80:21)
ReferenceError: authData is not defined
at C:\Users\User\Documents\Project\Project2\src\app.js:134:9
at C:\Users\User\Documents\Project\Project2\node_modules\jsonwebtoken\verify.js:223:12
at getSecret (C:\Users\User\Documents\Project\Project2\node_modules\jsonwebtoken\verify.js:90:14)
at Object.module.exports [as verify] (C:\Users\User\Documents\Project\Project2\node_modules\jsonwebtoken\verify.js:94:10)
at C:\Users\User\Documents\Project\Project2\src\app.js:127:8
at Layer.handle [as handle_request] (C:\Users\User\Documents\Project\Project2\node_modules\express\lib\router\layer.js:95:5)
at next (C:\Users\User\Documents\Project\Project2\node_modules\express\lib\router\route.js:137:13)
at verifyToken (C:\Users\User\Documents\Project\Project2\src\app.js:178:5)
at Layer.handle [as handle_request] (C:\Users\User\Documents\Project\Project2\node_modules\express\lib\router\layer.js:95:5)
at next (C:\Users\User\Documents\Project\Project2\node_modules\express\lib\router\route.js:137:13)
at Route.dispatch (C:\Users\User\Documents\Project\Project2\node_modules\express\lib\router\route.js:112:3)
at Layer.handle [as handle_request] (C:\Users\User\Documents\Project\Project2\node_modules\express\lib\router\layer.js:95:5)
at C:\Users\User\Documents\Project\Project2\node_modules\express\lib\router\index.js:281:22
at param (C:\Users\User\Documents\Project\Project2\node_modules\express\lib\router\index.js:354:14)
at param (C:\Users\User\Documents\Project\Project2\node_modules\express\lib\router\index.js:365:14)
at Function.process_params (C:\Users\User\Documents\Project\Project2\node_modules\express\lib\router\index.js:410:3)
P.S 这有助于理解问题:
当您之前发送过响应,然后尝试再次发送响应时,会出现此错误。为此,您必须检查是否有任何代码段发送您的响应两次。有时它是由于 Nodejs 的异步行为而发生的。有时,一个进程将处于事件循环中,我们发送响应,当它完成执行时,将再次发送响应。所以你可以使用回调或者async wait来等待执行。
PP.S按照答案中给出的代码示例后,现在我收到此错误(它现在与链接的问题更相似):
Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
at ServerResponse.setHeader (_http_outgoing.js:485:11)
at ServerResponse.header (C:\Users\User\Documents\Project\Project2\node_modules\express\lib\response.js:771:10)
at ServerResponse.send (C:\Users\User\Documents\Project\Project2\node_modules\express\lib\response.js:170:12)
at ServerResponse.json (C:\Users\User\Documents\Project\Project2\node_modules\express\lib\response.js:267:15)
at verifyToken (C:\Users\User\Documents\Project\Project2\src\app.js:176:9)
at Layer.handle [as handle_request] (C:\Users\User\Documents\Project\Project2\node_modules\express\lib\router\layer.js:95:5)
at next (C:\Users\User\Documents\Project\Project2\node_modules\express\lib\router\route.js:137:13)
at Route.dispatch (C:\Users\User\Documents\Project\Project2\node_modules\express\lib\router\route.js:112:3)
at Layer.handle [as handle_request] (C:\Users\User\Documents\Project\Project2\node_modules\express\lib\router\layer.js:95:5)
at C:\Users\User\Documents\Project\Project2\node_modules\express\lib\router\index.js:281:22
at param (C:\Users\User\Documents\Project\Project2\node_modules\express\lib\router\index.js:354:14)
at param (C:\Users\User\Documents\Project\Project2\node_modules\express\lib\router\index.js:365:14)
at Function.process_params (C:\Users\User\Documents\Project\Project2\node_modules\express\lib\router\index.js:410:3)
at next (C:\Users\User\Documents\Project\Project2\node_modules\express\lib\router\index.js:275:10)
at C:\Users\User\Documents\Project\Project2\src\app.js:35:3
at Layer.handle [as handle_request] (C:\Users\User\Documents\Project\Project2\node_modules\express\lib\router\layer.js:95:5)
最佳答案
当您的代码尝试多次发送响应时,会发生此错误,这是您的工作帖子 API 代码
app.post('/users/:id', verifyToken, function (req, res){
jwt2.verify(req.token, 'secretkey', (err, auth) =>{
if(err){
res.sendStatus(403);
} else {
res.json({
message: 'User created (in theory)',
auth
})
}
})
});
只需从该 API 中删除额外的响应代码
您必须删除验证 token 函数中的 next() 关键工作
function verifyToken(req, res, next){
// Get auth header value
const bearerHeader = req.headers['authorization'];
// Check if bearer is undefined
if(typeof bearerHeader !== 'undefined'){
// Split at the space
const bearer = bearerHeader.split(' ');
// Get token from array
const bearerToken = bearer[1];
// Set the token
req.token = bearerToken;
// Next middleware
next();
}
else{
// Forbidden
res.sendStatus(403);
}
}
使用此代码更新验证功能
关于javascript - Node.js,Express : Cannot set headers after they are sent to the client,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58816095/
我可以同步我的 Gmail 收件箱,但发送的文件夹不起作用。 这是我的 .mbsyncrc IMAPStore martinstabenfeldt-remote Account martins
我正在尝试从 nodeJS 发送电子邮件(使用 nodemailer 库),目前我在整个邮寄过程中遇到了一些超时问题。那不是我需要帮助的问题。我确实需要帮助的问题是,当它到达日志记录部分时,成功将为空
我在 WordPress 模板中使用 Contact Form 7 插件。我创建了表单和相关的 CSS,所以一切正常。当我单击发送按钮并成功发送电子邮件时,我需要执行以下操作。表单应该消失并显示“已发
我正在从辅助角色向服务总线队列发送消息。我注意到一些消息会随机丢失。 当我调试时,我在 Send 方法之后设置了一个断点,并登录到我的 Azure 面板以检查消息队列是否增加。我发现奇怪的是,有时消息
我是网站安全的新手,目前正在尝试深入了解同源策略。虽然在 stackoverflow 和其他地方有关于 SOP 概念的非常好的帖子,但我找不到关于 chrome 和其他浏览器是否允许跨域 XHR po
我正在从官方文档中学习 Solidity,并在我创建简单硬币的练习中进行堆栈: pragma solidity ^0.4.20; // should actually be 0.4.21 con
我们有一个需求,其中服务器需要将数据推送到各个客户端。所以我们继续使用 SSE(服务器发送事件)。我浏览了文档,但仍然不清楚这个概念。我有以下疑问: 场景 1。假设有 10 个客户。所以所有 10 个
我对 javascript/jquery 缺乏经验。我正在阅读 http://api.jquery.com/mouseover/ 的文档其中指出: The mouseover event is sen
所以我理解服务器发送事件的概念( EventSource ): 客户端通过 EventSource 连接到端点 客户端只监听从端点发送的消息 我感到困惑的是它在服务器上的工作方式。我看过不同的例子,但
我看过 here和 there尝试弄清楚服务器发送的事件是在传输级别。我还不确定。 两个消息来源都声称它们“只是 http”。然而,至少有两种方式可以解释这样的陈述。 当我第一次阅读那些文章时,我假设
我正在尝试使用 PHPMailer 在我的网站上创建联系表单。我在设置时遇到一些问题。我正在尝试使用 G-mail 作为我的 smtp 主机。我想知道是否有人可以帮助解决这个问题? 这是我的邮件代码:
我有一个大约 150 封电子邮件的文件夹,全部保存为 HTML 文件(Firefox 扩展),并且我需要捕获始终在“已发送”行中找到的年份;如下图所示。 我尝试使用 RegEx 但失败了;它根本不会打
我正在 Swift 中基于 NSObject 开发自定义类。它是一个状态菜单图标/菜单助手。当我收到在自定义类中单击图标的事件时,我想以 NSButton 允许创建 IBAction 来响应用户单击按
我尝试使用 MPI 对矩阵求和来执行此操作,我不知道为什么,但我无法使用 MPI_Send 发送任何类型的数据,但无论我在尝试什么我会收到一条错误消息吗: Sending 3 rows to task
我正在开发一个简单的收件箱/下午系统,我不明白为什么,但我可以显示已发送消息的显示,我可以显示已发送项目的列表,从收件箱查看下午消息,但不能确定我做错了什么,任何提示表示赞赏.. 这是我的代码:
我正在尝试在内容脚本和扩展程序之间传递消息 这是我在内容脚本中的内容 chrome.runtime.sendMessage({type: "getUrls"}, function(response)
我正在尝试将一段分成几个词。我手边有可爱的 nltk.tokenize.word_tokenize(sent),但是 help(word_tokenize) 说,“这个分词器被设计为一次处理一个句子。
我在从设备读取 SMS 消息时遇到问题。获取 URI content://sms/inbox 的内容提供者时,一切都很好。我可以阅读 person 列以在 people 表中找到外键并最终到达联系人及
我知道这个网站上有类似的问题,我已经尝试了一些建议的解决方案,其中一些对之前提出这个问题的人有效。但是,我仍然收到发送两次而不是一次的相同数据。 这是代码: final ProgressDialog
当做programmatic file upload时使用jQuery-File-Upload plugin启用分块后,我无法发送多个文件。 我调用电话的方式如下: fileUploadWidget.
我是一名优秀的程序员,十分优秀!