Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在express中正确使用app.set()?_Javascript_Node.js_Express_Middleware - Fatal编程技术网

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

Javascript 在express中正确使用app.set()?,javascript,node.js,express,middleware,Javascript,Node.js,Express,Middleware,在遇到app.set()和app.get()之前,我在访问express中间件中的变量时遇到了问题。然而,我想知道这是否是app.set()的适当用法,是否有更好的方法访问中间件内部的变量。以下是一个例子: var express = require("express"); var http = require("http"); var https = require("https"); var s3Client = require("./lib/s3_wrapper"); var drillC

在遇到app.set()和app.get()之前,我在访问express中间件中的变量时遇到了问题。然而,我想知道这是否是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()

但问题是,s3Client在我的app.get中间件中始终未定义,即使它在文件的顶部是必需的。但是中间件在另一个文件中?如果是这种情况,您需要在该文件中要求s3Client。不幸的是,不需要,require语句和中间件都在同一个文件中。这就是让我如此困惑的原因。好吧,但你不是在覆盖那个变量吗?要求s3Client使用
const
,以便在尝试覆盖时抛出错误