繁体   English   中英

将参数从应用程序获取一个文件的功能传递到另一个

[英]Passing parameter from app get function of one file to another

如何为在一个文件中调用的函数提供一个参数以在另一个文件中使用。 我正在尝试使用 node.js 和 express.js 创建一个 RestApi。 文件 entry.routes.js 包含以下代码:

  app.get("/energy/api/ActualTotalLoad/:AreaName/:Resolution/date/:Year-:Month-:Day", entry.findTwo);

但是,在此链接中,标头中有一些参数作为标记。 我使用以下代码解码令牌:

  app.use(
    jwt({
      secret: privateKey,
      credentialsRequired: false,
      getToken: function fromHeaderOrQuerystring (req) {
        if (req.headers.authorization && req.headers.authorization.split(' ')[0] === 'Bearer') {
            return req.headers.authorization.split(' ')[1];
        } else if (req.query && req.query.token) {
          return req.query.token;
        }
        return null;
      }
    }));

在文件 entry.controllers.js 中,代码如下:

exports.findTwo =async function (req, res) {
   console.log(req);
   const correct =await getResults2(req.user.apikey);
   console.log(correct);
   if (correct==1){
       Entry.findByPars(req.params.AreaName,req.params.Resolution,req.params.Year,req.params.Month,req.params.Day, (err, data) => {
        if (err) {
          if (err.kind === "not_found") {
            res.status(403).send({
              message: `No data`
            });
          } else {
            res.status(400).send({
              message: "Bad Request"
            });
          }
        } else{ 
            if(req.query.format!==undefined && req.query.format=="csv"){
                 const {Parser} = require('json2csv');
                 const json2csvParser=new Parser();
                 const csv=json2csvParser.parse(data);
                 res.send(csv);
            }
            else if (req.query.format==undefined || req.query.format=="json"){
                 res.send(data);
            }
            else { 
                res.status(400).send({
                message: "Bad Request"
                });
            }
          }

       });
   }
   else if (correct==2) res.status(402).send({ message: "Out of Quota"});
   else res.status(401).send({message: "Not authorized"});
}

在我执行以下命令时的最后一段代码中

const correct =await getResults2(req.user.apikey);

我尝试访问 req.user.apikey 的地方。 此参数在 entry.routes 文件中的其他 app.post 命令中可用,但在其他文件中不可访问。 它通过未定义。 例如,在 entry.routes 文件中,以下代码完美运行:

 app.post("/energy/api/Logout",function(req,res){
        console.log(req.user.apikey);
        var jwt=require('jsonwebtoken');
        sql.query(`SELECT apikey FROM users WHERE apikey=?`,[req.user.apikey],(err,res1) => {
            if (err) {
                console.log("error: ", err);
                result(err, null);
                return;
            }
            else if (res1.length){
                res.status(200).send(" ");
            }       
            else res.status(400).send("Bad Request");
        });
  });

为什么文件entry.controllers 的entry.findTwo 函数中没有传递参数req.user.apikey?

💡 当你向这个端点发送请求时,你只能从req.user.apikey中的entry.controller获取值的一个原因

app.get("/energy/api/ActualTotalLoad/:AreaName/:Resolution/date/:Year-:Month-:Day", entry.findTwo);

这是因为您在发送请求之前向标头添加了authorization

👨‍🏫需要注意的是:这个req.user.apikey来自您在发送请求之前在标头中提供的访问令牌

因为您使用的是express-jwt ,所以,您包含在标头中的每个令牌都将被直接解码并添加到req参数中,这就是您可以访问req.user.apikey的原因。

因此,如果您的问题 ❓ 是为什么req.user.apikey只能在entry.controller访问,那么答案是因为在您的另一条路线上,例如:

当你调用这条路线时: energy/fire/logout

你没有在那里添加授权。

💡 因此,为了能够在您的其他路由上使用req.user.apikey ,请确保在您的header添加了授权

希望能帮到你🙏。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM