Node.js 节点";can';t发送标题后设置标题重置“;如何使用express呈现具有不同数据的相同ejs页面
我的问题是:我使用nodejs和express来呈现ejs页面。我有一个带有“查看”按钮的UI,我的javascript使用window.open打开页面 使用Node.js 节点";can';t发送标题后设置标题重置“;如何使用express呈现具有不同数据的相同ejs页面,node.js,express,Node.js,Express,我的问题是:我使用nodejs和express来呈现ejs页面。我有一个带有“查看”按钮的UI,我的javascript使用window.open打开页面 使用app.get()我使用参数和一些javascript呈现页面,具体取决于用户在UI中填写的内容。这意味着我只有一个EJ能够收集各种数据 我所做的工作在本地非常有效,但在服务器端它第一次工作时,我在第二次单击时出现错误: Error: Can't set headers after they are sent. at Server
app.get()
我使用
参数和一些javascript呈现页面,具体取决于用户在UI中填写的内容。这意味着我只有一个EJ能够收集各种数据
我所做的工作在本地非常有效,但在服务器端它第一次工作时,我在第二次单击时出现错误:
Error: Can't set headers after they are sent.
at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:335:11)
at ServerResponse.header (/home/ec2-user/node_modules/express/lib/response.js:718:10)
at ServerResponse.send (/home/ec2-user/node_modules/express/lib/response.js:163:12)
at done (/home/ec2-user/node_modules/express/lib/response.js:957:10)
at View.exports.renderFile [as engine] (/home/ec2-user/node_modules/ejs/lib/ejs.js:363:10)
at View.render (/home/ec2-user/node_modules/express/lib/view.js:126:8)
at tryRender (/home/ec2-user/node_modules/express/lib/application.js:639:10)
at EventEmitter.render (/home/ec2-user/node_modules/express/lib/application.js:591:3)
at ServerResponse.render (/home/ec2-user/node_modules/express/lib/response.js:961:7)
at /home/ec2-user/firstnodeapp/expressUI.js:64:15
基本上,我想做的是能够清除我打开第一页时发送的所有内容,以便再次设置标题。至少我是这么想的
如果有人想帮忙,我可以提供更多信息
编辑:这是我的expressUI.js(相当于server.js),有点凌乱,但希望能有所帮助
var express = require('express'),
app = express(),
http = require('http').Server(app),
io = require('socket.io')(http);
const EventEmitter = require('events');
const util = require('util');
function MyEmitter() {
EventEmitter.call(this);
}
util.inherits(MyEmitter, EventEmitter);
require('./public/Tools/support.js')();
app.use(express.static("public"));
app.use(readAll);
socketConnectionOn(io);
myEmitter = new MyEmitter();
myEmitter.on('download_ready', function(subscription_number) {
console.log('express1')
io.emit('download', subscription_number)
});
app.get('/', function(req, res) {
io.on('connection', function(socket){
var chargify = require('chargify'),
chargify_site = chargify('*name*', '*key*');
chargify_site.get('subscriptions.json', function(err, res, body) {
socket.emit('All Subscriptions', body);
});
});
res.render('UI_design.ejs', {});
});
app.get('/subscription/:subscriptionID', function(req, res) {
if (req.url != '/favicon.ico' && req.url != '/') {
myEmitter.on('allRead', function(trnsctns, sbs, charges, payments, curr_charges, paym, stNumber, address, lastDate) {
if (charges.length == 0) {
res.render('PaymentArrayEmpty.ejs', {});
} else {
io.on('connection', function(socket){
socket.emit('trs_data', charges, payments);
});
var async = require("async");
async.parallel({list:function(callback) {
var list = createListOfParameters(trnsctns, sbs.subscription, charges, payments, curr_charges, paym, address[0], address[3], address[4], stNumber, lastDate)
callback(null, list);
},
},
function(err, results) {
console.log('Right subscription ID!');
console.log(__dirname)
res.render('nessa_invoice_5.ejs', results.list);
});
}
});
}
});
app.get('/download/:subscriptionNb', function(req, res){
console.log('expressDownload')
var subscriptionID = req.url.substr(10)
var file = __dirname + '/public/Tools/Invoices/statement_' + subscriptionID + '_' + todayString() + '.pdf';
res.download(file)
});
http.listen(80, function(){
console.log('listening on *:80');
});
我想做的是“res.render('nessa_invoice_5.ejs',results.list);”可以工作多次。
谢谢
意味着
您正在尝试多次从服务器发送对特定请求的响应。我认为,您必须使用
ejs.renderFile()
或ejs.compile(),而不是使用res.render()
,并在根据您的需要渲染、操作和安排每件事情之后手动发送一次响应。以下链接可能会有所帮助:我发现了一个窍门!
事实上,我不明白,因为在我的代码的最后版本中,我可以多次呈现页面,然后我就不能了。我真的不明白为什么它会起作用,但这里有一个解决方案,以防有人有类似的问题
你只需要把
myEmitter = new MyEmitter();
myEmitter.on('download_ready', function(subscription_number) {
console.log('express1')
io.emit('download', subscription_number)
});
内部
app.get('/subscription/:subscriptionID', function(req, res) {
if (req.url != '/favicon.ico' && req.url != '/') {
//code
}
});
,在开头。您能添加路线定义吗?您好,谢谢您的回答。我读了这些,实际上这就是我的代码中发生的事情。但我想这么做。我想多次呈现相同的ejs文件,只改变其中的数据,但保持相同的html结构。我喜欢你的想法。我测试了它,但我不知道它到底有什么帮助:基本上它使我能够延迟res.send。但实际上我需要发送结果,否则我的网页是空白的。每次我想看到一个页面时,我都需要发送结果,清除所有内容后,才能基于相同的ejs发送另一个页面。@Tchak这就是它的工作原理。不能在一个请求中发送多个HTML页面。实际上,我的意思是独立呈现所有页面,并将它们组合成单个响应,然后将它们作为单个响应/HTML文件重新发送,这样您就不需要多次发送标题。。
app.get('/subscription/:subscriptionID', function(req, res) {
if (req.url != '/favicon.ico' && req.url != '/') {
//code
}
});