Передав параметр из приложения, получить функцию одного файла в другой - PullRequest
0 голосов
/ 23 января 2020

Как я могу дать функции, которая вызывается в одном файле, параметр для использования в другом файле. Я пытаюсь создать RestApi с node.js и express. js. Файл 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. Этот параметр доступен в других командах app.post в файле entry.routes, но недоступен в другом файле. Это проходит как неопределенное. Например, в файле 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");
        });
  });

Почему параметр req.user.apikey не передается в функцию entry.findTwo для записи файла. контроллеры

1 Ответ

0 голосов
/ 23 января 2020

? Одна причина , почему вы можете получить значение только из 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 у вас есть добавленная авторизация .

Надеюсь, это поможет вам ?.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...