如何同时使用res.sendFile();和res.send();在Node.js中?

时间:2018-12-13 08:12:40

标签: javascript node.js express

我有此代码:

server.get("/chat", (req, res) => {
    let query = url.parse(req.url, true).query;
    console.log(query.channel);
    let rueckgabe = {
        channel: query.channel
    };
    res.sendFile('chat.html', { root: path.join(__dirname, 'public/') });
    res.send(JSON.stringify(rueckgabe));
});

我不能同时使用res.sendFileres.send。如何在server.get中同时使用两者?

不同的方法

如果我尝试这样的操作,它将仅执行第一个代码。

server.get("/chat", (req, res) => {
    let query = url.parse(req.url, true).query;
    console.log(query.channel);
    let rueckgabe = {
        channel: query.channel
    };
    res.send(JSON.stringify(rueckgabe));
});

server.get("/chat", (req, res) => {
    res.sendFile('chat.html', { root: path.join(__dirname, 'public/') });
});

因此结果将是获得rueckgabe,但没有html页面。

2 个答案:

答案 0 :(得分:1)

不能在同一路由和方法中同时使用res.send()res.sendFile(),因为每个请求只有一个响应,并且每个请求都被首先调用,这就是您的响应。

但是您可以使用不同的方法,首先发出ajax发布请求以进行“聊天”,并在回调中获取其“ rueckgabe”数据,然后转到“ / chat?data = something”之类的新路径。例如,将代码更改为此: (有关params的更多信息)

server.post("/chat/:channel", (req, res) => {
    let query = req.params;   
    console.log(query.channel);
    let rueckgabe = {
        channel: query.channel
    };
    res.json(JSON.stringify(rueckgabe));
});

server.get("/chat", (req, res) => {
    res.sendFile('chat.html', { root: path.join(__dirname, 'public/') });
});

您也可以通过这种方式使用它,但是这是一种扼杀的方法,因为现在您错过了您的rueckgabe数据:

res.send(JSON.stringify(rueckgabe));
// "Warning:" use redirect after send is not routine and usual
res.redirect('/chat');  // redirect to chat with GET method

因此,通常在客户端进行处理并在响应回调中提出新请求。

答案 1 :(得分:0)

解决方案

要在客户端获取参数,您需要使用此功能:

function searchToObject() {
  var pairs = window.location.search.substring(1).split("&"),
    obj = {},
    pair,
    i;

  for ( i in pairs ) {
    if ( pairs[i] === "" ) continue;

    pair = pairs[i].split("=");
    obj[ decodeURIComponent( pair[0] ) ] = decodeURIComponent( pair[1] );
  }

  return obj;
}

var urlParameters = searchToObject();

如果不需要服务器提供的url参数,则可以使用这种方法。 urlParameters包含带有url参数的json对象。