在 express中正确使用 app.set()



我在访问快速中间件中的变量时遇到问题,直到我遇到app.set((和app.get((。 但是,我想知道这是否是app.set((的适当用法,以及是否有更好的方法来访问中间件内部的变量。 下面是一个示例:

var express = require("express");
var http = require("http");
var https = require("https");
var s3Client = require("./lib/s3_wrapper");
var drillClient = require('./lib/drill_wrapper');
var fs = require("fs");
var app = express();
app.set("s3Client", s3Client);
app.set("drillClient", drillClient);
var adminParams = JSON.parse(fs.readFileSync("./conf/config.json"), "utf-8");
var adminBucket = adminParams.bucket;
var adminS3Client = new s3Client(adminParams);
app.use(function(req, res, next) {
    var accessKey = req.header("Authorization");
    adminS3Client.getObject({Bucket: adminBucket, Key: accessKey})
                 .then(function(results) {
                     req.config = JSON.parse(results.Body);
                     next();
                 })
                 .catch(function(err) {
                     console.log(err);
                     res.status(err.status).send(err.message);
                 });
});
app.get("/getObject/:bucket/:objectKey", function(req, res) {
    var params = {
        Bucket: req.params.bucket,
        Key: req.params.objectKey
    };
    var s3 = req.app.get("s3Client");
    var s3Client = new s3(req.config);
    s3Client.getObject(params)
            .then(function(results) {
                res.status(200).send(results.Body);
            })
            .catch(function(err) {
                res.status(500).send(err.message);
            });
});

正如您在 app.get("/getObject"( 路由中看到的,我正在使用 req.app.get("s3Client"(,因为没有它,我无法创建 s3Client 的新实例,因为此时 s3Client 始终未定义。 谢谢你的时间。

我会冒险说这不是一个好的用途。您将整个模块放入该变量中?为什么?如果您需要在其他地方使用该模块,您只需再次需要它。如果您将所有内容都放在一个文件中,则将其添加到顶部一次就足够了。

const s3Client = require("./lib/s3_wrapper");
app.get("/getObject/:bucket/:objectKey", function(req, res) {
  //s3Client was already defined.
  s3Client.something()
});

然后在其他文件中,某处。

//you import it again
const s3Client = require("./lib/s3_wrapper");
s3Client.something()

最新更新