NodeJS Express中的范围混淆

mbzjlibv  于 2023-10-17  发布在  Node.js
关注(0)|答案(1)|浏览(104)

我在一个基于Node的Web服务器中使用Express(4.10.8),该服务器使用'vhost'包处理多个站点。每个域都在自己的目录中,每个域都有自己的“app.js”代码。
我正在尝试重写请求URL(说来话长),下面的代码在app.use()函数中,按照预期的方式运行。
但是在这个函数之外,被删除的日志调用会失败,并出现一个错误,表明我对req.url的引用超出了作用域:

ReferenceError: req is not defined
    at Object.<anonymous> (/home/brianc/websites/rppc/app.js:12:36)
    at Module._compile (internal/modules/cjs/loader.js:999:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1027:10)
    at Module.load (internal/modules/cjs/loader.js:863:32)
    at Function.Module._load (internal/modules/cjs/loader.js:708:14)
    at Module.require (internal/modules/cjs/loader.js:887:19)
    at require (internal/modules/cjs/helpers.js:74:18)
    at Object.<anonymous> (/home/brianc/websites/app.js:82:15)
    at Module._compile (internal/modules/cjs/loader.js:999:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1027:10)
{"level":"error","message":"Forever detected script exited with code: 1"}

我试图弄清楚到底发生了什么,当然,也是为了解决这个问题,因为我需要重写的请求URL,而不是进入服务器的URL。正则表达式在函数内部按预期工作。

var express = require('express');

var app = express();
app.use(express.static(__dirname + '/../public'));
app.use(express.static(__dirname ));
app.use(function(req, res, next) {
        req.url  = req.url.replace(/(.*)?<!\.html|\.pdf$/, "/$1.pdf");
        req.url =  req.url + ".pdf";
        console.log("URL was changed to: " + req.url);
        next();
});
//console.log("We changed URL to " + req.url);
app.use(express.static(__dirname,{extensions: ['html','pdf']}));

module.exports = app;
tuwxkamq

tuwxkamq1#

找到答案了!!
在Express v4中,不能在use()方法中调用请求URL。但是它将与get()方法一起工作。
所以这段代码做了我上面想做的事情,即。将“.pdf”添加到没有任何后缀的任何请求URL。...

app.get(/^[^.]*$/, (req, res,next) => {
  console.log("No suffix on " + req.url + " \n")
  req.url += ".pdf"
  next()
})

相关问题