Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 节点";can';t发送标题后设置标题重置“;如何使用express呈现具有不同数据的相同ejs页面_Node.js_Express - Fatal编程技术网

Node.js 节点";can';t发送标题后设置标题重置“;如何使用express呈现具有不同数据的相同ejs页面

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

我的问题是:我使用nodejs和express来呈现ejs页面。我有一个带有“查看”按钮的UI,我的javascript使用window.open打开页面

使用
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
}
});