我正在写一个可以设置标题的库.如果标头已经发送,我想给出一个自定义错误消息,而不是让它失败,Node.js给出的"无法在发送标题后设置标题".那么如何检查标头是否已经发送?
目前我正在尝试在api调用中更新两个不同的用户架构.
第一个模式记录在用户模式中,我们给它命名= Tom第二个模式是注册该应用程序的其他用户,我们给它命名= John
架构代码
schema.js
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var bcrypt = require('bcrypt-nodejs');
var UserSchema = new Schema({
name: String,
username: { type: String, required: true, index: { unique: true }},
password: { type: String, required: true, select: false },
followers: [{ type: Schema.Types.ObjectId, ref: 'User'}],
following: [{ type: Schema.Types.ObjectId, ref: 'User'}],
followersCount: Number,
followingCount: Number
});
module.exports = mongoose.model('User', UserSchema);
Run Code Online (Sandbox Code Playgroud)
api名称是'/ follow /:user_id',我想要实现的是.每当用户Tom跟随John这样的其他用户时,Tom的跟随字段将被更新以及John的跟随者字段.
我当前的尝试(req.decoded.id是登录用户)
api.js
// The first way
apiRouter.post('/follow/:user_id', …Run Code Online (Sandbox Code Playgroud) 当此代码命中重定向行时,它会抛出"在发送错误后无法设置标头"并且不会重定向.我对没有完全理解标题以及如何表达与它们一起工作感到内疚.关于这个错误的这个链接让我感到困惑,可能是因为我对正在发生的事情没有基本的了解.此外,我知道这是一种天真的验证方法,但我只是想让基本的东西工作.
app.post('/api/login', function(req, res) {
if (req.body.password === auth.password) {
auth.date = new Date()
res.redirect('/admin')
} else {
console.log("wrong pw")
}
})
Run Code Online (Sandbox Code Playgroud)
更新:谢谢@Brendan Ashworth我错过了一个显而易见的其他内容,我现在已经添加了,不再收到错误.
但是这一行不会改变我页面的内容
res.sendfile('./public/admin/views/tunes.html')
Run Code Online (Sandbox Code Playgroud)
它在我用auth检查包装它之前有效
var auth = require('../config/auth')
module.exports = function(app) {
/*
* CONTENT API
*/
//...
/*
* Admin Routes
*/
app.get('/admin/login', function(req, res) {
res.sendfile('./public/admin/views/login.html')
})
app.post('/api/login', function(req, res) {
if (req.body.password === auth.password) {
auth.date = new Date()
res.redirect('/admin')
} else {
res.json({message: 'Wrong password!'})
}
})
app.get('/admin', function(req, res) { …Run Code Online (Sandbox Code Playgroud) 请帮帮忙,这个是一个主要的BLOCKER!
我有一个使用NodeJS + jQuery Form Plugin + Typescript的项目,我正在尝试上传文件.文件上传后,服务器会向POST消息发送响应,该消息在屏幕上呈现.在POST响应呈现在屏幕上之前,文件确实已成功上传.我希望POST响应调用"成功"函数,而不是重定向页面以显示JSON响应.
这是代码:
$(new ID().setAsRoot().selectId()).append(
"<form id=\"fileUploadForm\" accept-charset=\"utf-8\" method=\"post\" action=\"/upload\" enctype=\"multipart/form-data\">" +
"<input id = \"filename\" type=\"file\" name=\"userfile\" multiple=\"multiple\" />" +
"<button type=\"submit\" id = \"submitButton\"> Upload </button></form>");
var form = $("#fileUploadForm");
form.submit(function (e) {
//e.preventDefault();
this.ajaxSubmit({
type: form.attr('method'),
url: form.attr('action'),
data: form.serialize(),
success: function (data) {
var x = JSON.parse(data);
alert("Success : " + x);
},
error: function (data) {
var x = JSON.parse(data);
alert("Error : " + x);
}
});
});
Run Code Online (Sandbox Code Playgroud)
不会调用success函数(这意味着警报消息不会显示).JSON数据只是在屏幕上呈现如下: …
mongodb集合中有20,000条记录.我在csv中导出所有这些记录.我使用这个发送部分响应:
res.writeHead(200, {
"Content-Type": "application/csv",
"Content-disposition": "attachment; filename='import.csv'"
});
res.write(data + '0', "binary");
Run Code Online (Sandbox Code Playgroud)
上面的代码以500的批量执行.我在处理所有记录时使用此代码结束.
if (++responseCount == loopCount) {
res.end();
}
Run Code Online (Sandbox Code Playgroud)
但我得到了这个错误:
发送后无法设置标头.
但我得到的文件下载了500条记录.
这是我的完整代码.
var exportData = function (req, res, next) {
var limit = 500;
var responseCount = 0;
var loopCount = 1;
var size = 30000;
//Get 500 records at one time
var getData = function (req, start, cb) {
req.db.collection('items').find().skip(start).limit(limit).toArray(function (err, records) {
if (err) throw err;
cb(null, records);
});
};
if (size > limit) { …Run Code Online (Sandbox Code Playgroud) My deployment on Heroku keep crashing on the POST request when I send the mulitpart form. I can't see in the logs if it's on the upload (multer) function, save (mongoose) function or sendMail (nodemailer) function. The only thing I see in the logs is a H18 error: Internal Server.
Router.js
const express = require("express");
const mongoose = require("mongoose");
const router = express.Router();
const multer = require("multer");
const path = require("path");
const File = require("../models/Files");
const mail = require("../handlers/mailer");
// …Run Code Online (Sandbox Code Playgroud) 我正在使用express 构建一个简单的服务器。一切正常,但每次我尝试硬刷新(cntr + R)我的页面时,我都会在控制台中收到这个恼人的错误。
错误 [ERR_HTTP_HEADERS_SENT]:将标头发送到客户端后无法设置标头
这是代码:
app.get('/index', (req, res) => {
const filePath = path.join(__dirname, 'public', 'index.html');
console.log(res.headersSent);
res.sendFile(filePath);
});
Run Code Online (Sandbox Code Playgroud)
console.log (res.headersSent)用于检查是否确实未设置标头(每次都会记录 false)。
我尝试发送一个简单的 JSON 而不是文件,并且没有发生错误:
app.get('/index', (req, res) => {
const filePath = path.join(__dirname, 'public', 'index.html');
console.log(res.headersSent);
res.json({status: 'All good'});
});
Run Code Online (Sandbox Code Playgroud)
仅当我使用 res.sendFile() 时才会出现该错误。一旦加载,index.html将请求一个index.js文件。也许这就是问题所在?但这不是一个不同的要求吗?
谢谢你!
编辑我尝试检查 sendFile() 回调函数中的错误。它是未定义的,即使控制台不断吐出“无法设置标头”错误
我想在后端进行串行工作.我想选择geo_unit并做另一项工作并向客户端写回复.我阅读了 http://nodejs.org/docs/v0.4.7/api/events.html#events和错误:无法在将标题发送到客户端后设置标题
当我慢慢发送请求时,一切正常,例如每3秒发送一次.
但是当我快速发送请求时它不起作用.我得到以下错误.我是否在全球定义了什么?
Error: Can't set headers after they are sent.
at ServerResponse.OutgoingMessage.setHeader (http.js:691:11)
at ServerResponse.res.setHeader (E:\git\xxxxxx-nodejs\node_modules\express\node_modules\connect\lib\patch.js:63:22)
at ServerResponse.res.set.res.header (E:\git\xxxxxx-nodejs\node_modules\express\lib\response.js:527:10)
at ServerResponse.res.json (E:\git\xxxxxx-nodejs\node_modules\express\lib\response.js:194:36)
at EventEmitter. (E:\git\xxxxxx-nodejs\routes\api_scrapper.js:17:17)
at EventEmitter.emit (events.js:117:20)
at ScrapperAPI.externalLocationCallback (E:\git\xxxxxx-nodejs\routes\api_scrapper.js:27:20)
at Query._callback (E:\git\xxxxxx-nodejs\routes\api_scrapper.js:51:21)
at Query.Sequence.end (E:\git\xxxxxx-nodejs\node_modules\mysql\lib\protocol\sequences\Sequence.js:78:24)
at Query._handleFinalResultPacket (E:\git\xxxxxx-nodejs\node_modules\mysql\lib\protocol\sequences\Query.js:143:8)
我使用以下代码:
var express = require('express'),
http = require('http'),
path = require('path');
var app = module.exports = express();
var server = require('http').createServer(app);
var io = require('socket.io').listen(server);
var request = require('request');
var cheerio = require('cheerio');
var mysql = … 好吧,在我阅读了很多有关此问题的帖子后,我开始停滞不前.这个错误很受欢迎Error: Can't set headers after they are sent.
最好的答案在这里,但是,我没有重复的功能或两次执行的回调(至少不是我知道的),它只是一个标准的基础休息API.
完整跟踪日志:
/home/nano/Dev/JS/OMI/node_modules/mongoose/lib/utils.js:413
throw err;
^
Error: Can't set headers after they are sent.
at ServerResponse.OutgoingMessage.setHeader (http.js:689:11)
at ServerResponse.header (/home/nano/Dev/JS/OMI/node_modules/express/lib/response.js:666:10)
at ServerResponse.send (/home/nano/Dev/JS/OMI/node_modules/express/lib/response.js:146:12)
at ServerResponse.json (/home/nano/Dev/JS/OMI/node_modules/express/lib/response.js:235:15)
at Promise.<anonymous> (/home/nano/Dev/JS/OMI/app/routes/clientes.js:19:11)
at Promise.<anonymous> (/home/nano/Dev/JS/OMI/node_modules/mongoose/node_modules/mpromise/lib/promise.js:172:8)
at Promise.emit (events.js:95:17)
at Promise.emit (/home/nano/Dev/JS/OMI/node_modules/mongoose/node_modules/mpromise/lib/promise.js:84:38)
at Promise.reject (/home/nano/Dev/JS/OMI/node_modules/mongoose/node_modules/mpromise/lib/promise.js:111:15)
at Promise.error (/home/nano/Dev/JS/OMI/node_modules/mongoose/lib/promise.js:95:15)
Run Code Online (Sandbox Code Playgroud)
无论如何,我的代码很简单:
index.js:
"use strict";
var express = require('express'),
router = express.Router();
var clientes = require('./clientes');
var items = require('./items');
router.route('/clientes')
.post(clientes.crear)
.put(clientes.actualizar)
.delete(clientes.borrar);
router.route('./items') …Run Code Online (Sandbox Code Playgroud) 我是节点之地的新手,我有一个像下面的情况,我首先想要设置一个cookie,然后重定向到其他网址.但是我得到了错误 - Unhandled rejection Error: Can't set headers after they are sent.
user_details = [req.body.user_name, req.body.user_email, req.body.user_contact, req.body.route_id];
var user_details_str = JSON.stringify(user_details);
res.cookie('user_details', user_details_str, {maxAge : 7 * 24 * 3600000, httpOnly:false});
res.redirect('/route1');
Run Code Online (Sandbox Code Playgroud)
我经历了这个Node.js错误:在发送之后无法设置标头并且理解res.redirect()为尝试重写标头但不知道如何解决此问题.
编辑:完整的代码.
router.post('/register', encryptor.encryptUserPassword, function(req, res, next) {
req.body.confirmed = false;
Models.users.create(req.body).then(function(user) {
user_details = [req.body.user_name, req.body.user_email, req.body.user_contact, req.body.route_id];
var user_details_str = JSON.stringify(user_details);
res.cookie('user_details', user_details_str, {maxAge : 7 * 24 * 3600000, httpOnly:false});
user.user_pass = '';
sess = res.session;
// sess.email = …Run Code Online (Sandbox Code Playgroud) 您好,我遇到此错误,但我不明白为什么会出现该错误,请帮我解决它。
var fs = require("fs");
var port = 3000;
//Creating pool conection database
var mysql = require("mysql");
function ConnectDB()
{
this.result = "r";
this.conexion = mysql.createPool
({
host: "localhost",
user: "root",
password: "rometotalwar2",
database: "WebDatabase"
});
this.SignUpUser = function(nombre,apellidos,nick,pass,email,callback)
{
var querystring = "SELECT Nickname,Correo from Users WHERE Nickname='"+nick+"' and Correo='"+email+"';";
this.conexion.getConnection(function(err, connection)
{
if(err)
{
}
else
{
connection.query(querystring,function(err,result,fields)
{
if(err)
{
}
else
{
if(result.length != 0)
{
callback("NO");
}
else
{
var querystring = "INSERT INTO Users …Run Code Online (Sandbox Code Playgroud)node.js ×10
express ×6
javascript ×4
cookies ×1
csv ×1
deployment ×1
heroku ×1
http ×1
http-headers ×1
jquery ×1
mean-stack ×1
mongodb ×1
mongoose ×1
multer ×1
nodemailer ×1
post ×1
server ×1