8

我正在使用 expressjs,我想做这样的事情:

app.post('/bla',function(req,res,next){
   //some code
   if(cond){
      req.forward('staticFile.html');
   }
});
4

4 回答 4

9

正如 Vadim 指出的,您可以使用 res.redirect 向客户端发送重定向。

如果您想返回静态文件而不返回客户端(如您的评论所建议的那样),那么一种选择是在使用 __dirname 构造后简单地调用 sendfile。您可以将下面的代码分解为单独的服务器重定向方法。您可能还想注销路径以确保它是您所期望的。

    filePath = __dirname + '/public/' + /* path to file here */;

    if (path.existsSync(filePath))
    {
        res.sendfile(filePath);
    }
    else
    {
       res.statusCode = 404;
       res.write('404 sorry not found');
       res.end();
    }

这是供参考的文档: http: //expressjs.com/api.html#res.sendfile

于 2013-02-09T13:35:01.120 回答
1

这种方法适合您的需要吗?

app.post('/bla',function(req,res,next){
   //some code
   if(cond){
      res.redirect('/staticFile.html');
   }
});

当然,您需要使用 express/connectstatic中间件来获得此示例工作:

app.use(express.static(__dirname + '/path_to_static_root'));

更新:

你也可以简单的流文件内容来响应:

var fs = require('fs');
app.post('/bla',function(req,res,next){
   //some code
   if(cond){
      var fileStream = fs.createReadStream('path_to_dir/staticFile.html');
      fileStream.on('open', function () {
          fileStream.pipe(res);
      });
   }
});
于 2013-02-09T12:49:39.167 回答
0

Sine express 已弃用 res。sendfile你应该使用 res. 而是发送文件

请注意,sendFile需要一个相对于当前文件位置的路径(而不是像sendfile那样的项目路径)。要使其具有与sendfile相同的行为- 只需将 root 选项设置为指向应用程序根目录:

var path = require('path');
res.sendfile('./static/index.html', { root: path.dirname(require.main.filename) });

在这里找到有关的解释path.dirname(require.main.filename)

于 2017-08-17T11:07:58.773 回答
0

基于@bryanmac 的回答:

app.use("/my-rewrite", (req, res, next) => {
    const indexFile = path.join(__dirname, "index.html");

    // Check if file exists
    fs.stat(indexFile, (err, stats) => {
        if (err) {
            // File does not exist or is not accessible.
            // Proceed with other middlewares. If no other
            // middleware exists, expressjs will return 404.
            next();
            return;
        }

        // Send file
        res.sendFile(indexFile);
    });
});

由于在 Node.js v16.9.1path.existspath.existsSync不再存在,fs.stat因此使用。

于 2021-09-16T13:41:49.963 回答