通过node.js和express提供静态和动态内容的混合

问题描述 投票:0回答:1

这类似于条目21105801,但不完全相同。

(版本:[email protected][email protected]

我正在尝试创建一条路由,该路由将为动态页面(如果找到)或通过静态路由(通过next())传递给静态路由器。

我的路线应该这样运行,app.get('/'->身份验证->尝试动态投放->尝试静态投放。

我添加了一个处理Oauth 1和2的授权路由,并且仅静态页面就可以正常工作。但是我想在身份验证后提供自定义页面,我遇到了三个问题。

  1. 我不想使用'render()'来按名称显式提供每个动态页面,因此我手动构建文件路径并绕过'view'逻辑。这适用于HTML,但是...
  2. 它不适用于我用于Foundation的JS和CSS。实际上,render()永远不会以错误调用回调,因为它找不到css / js文件,甚至认为路径是一个模块?
  3. [奇怪的是,视图引擎要求所有内容都在一个视图路径中。还是我缺少明显的设计模式?

这里是路线:

app.use(
    "/", // i like being pedantic
    authorize, // pass through the auth filter
    function(req, res, next) { // try to serve dynamic page
        // build the filename
        var file = __dirname + '/restricted' + req.url;
        console.log("Rendering file "  + file);
        res.render(file, { username: req.user.username } , function(err, html) {
            if (err) {
                console.log("ERROR: " + err);
                next(); // pass to static router
            } else {
                res.send(html); // or send the page
            }
        })
    },
    // fallthrough route for js/css statics
    express.static(__dirname + "/restricted")
);

这里是错误,它正在尝试读取index.html,它调用了CSS模板和JS rel。

GET /auth/twitter/callback?oauth_token=... 302 329.979 ms - 78
Rendering file /home/pt/www/restricted/index.html
ERROR: null
       ^---- this worked!
GET /index.html 200 7.097 ms - 838
Rendering file /home/pt/www/restricted/css/foundation.css
               ^---- that's the file I want to read!
GET /css/foundation.css 500 9.846 ms - 871
    ^---- keep going!!!
Error: Cannot find module 'css'
                   ^---- DOH! Why does it look for a module?!?!? Why no error callback?
at Function.Module._resolveFilename (module.js:338:15)
at Function.Module._load (module.js:280:25)
at Module.require (module.js:364:17)

提前感谢。

我想我想做的事情确实很明显,但是几乎所有的动态视图引擎示例都为每个显式文件调用res.render('filename'),这似乎很荒谬:为什么每次添加一个时都要更改路由器代码新的动态页面?

node.js dynamic express static
1个回答
0
投票
  • 将全局通配符路由[app.use('/')]用于静态内容和
  • 使用特定的路由[app.get(/ myroute),app.post('/ anotherroute')]使用自定义逻辑进行动态处理
//Serves resources from public folder 
app.use('/',express.static(__dirname + '/public')); 

//Verify the complete directory path - especially slashes 
console.log('Static directory '+__dirname + '/public');

//serve on custom routes
app.get('/list', function (req, res) {
    res.send('<html><body><h1>Hello World</h1></body></html>'); });
© www.soinside.com 2019 - 2024. All rights reserved.