【问题标题】:Nodejs - Call a service from a typescript controllerNodejs - 从打字稿控制器调用服务
【发布时间】:2021-12-30 08:17:55
【问题描述】:

在我的控制器中,我有这个方法可以渲染一个标记文件,将一个对象发送到带有数据的视图(dataView)

export const renderRecoveryData = (
  req: Request | any,
  reply: ResponseToolkit,
  callback: any
): void => {
  const dataView: { [key: string]: any } = {
    id: 1,
    info: getInfo(req, reply, callback),
  };
  templateEngine.renderFromTemplate(
    "./views/private/info/info.marko",
    dataView,
    req,
    reply,
  );
};

在“信息”属性中,我想使用以下方法加载一个对象,该对象从调用两个服务中获取数据:

const getInfo = (req: Request | any, reply: any, callback: any): void => {
  const headers = helpers.setHeaders(req);
  const idNumber = req.yar.get('idNumber');
  async.parallel({
    personalData: (callback: any) => infoService.personalInfo(idNumber, headers, callback),
    addionalInfo: (callback: any) => infoService.addicionalInfo(headers, callback),
  }, (err: any, responses: any) => {
    if (err) {
      return callback(err);
    }
    console.log("response", responses);
    return responses;
  });
};

console.log 正确地向我显示了我想要保存在“dataView”的“info”属性中的对象,但是当我检查视图获取的内容时,“info”属性没有显示,它只是显示“id”属性

我从路由文件中调用“renderRecoveryData”:

  server.route({
    method: "GET",
    path: "/{locale}/private/info/dashboard/step1",
    handler: renderRecoveryData,
  });

可能是什么问题?谢谢

【问题讨论】:

  • 发生这种情况是因为getInfo 是异步函数,您必须在调用它时使用await 或在getInfo 的回调中渲染模板。其他问题是您没有在成功的情况下调用回调(请将return responses 替换为return callback(null, responses))。
  • 我正在测试你的推荐,谢谢
  • 我通过详细的代码更改添加了答案。我希望它会有所帮助。

标签: javascript node.js typescript


【解决方案1】:

我在代码中看到 2 个问题:

  1. getInfo 是异步函数,在控制器中调用时没有添加回调/等待。
  2. getInfo 函数中成功时不会调用回调。

将代码更改为如下所示应该可以:


export const renderRecoveryData = (
  req: Request | any,
  reply: ResponseToolkit,
  callback: any
): void => {

  getInfo(req, reply, (err, info) => {
    if(err) {
      // Handle error
    }

    const dataView: { [key: string]: any } = {
      id: 1,
      info,
    };
   
    templateEngine.renderFromTemplate(
      "./views/private/info/info.marko",
      dataView,
      req,
      reply,
    );
  });
  
};

const getInfo = (req: Request | any, reply: any, callback: any): void => {
  const headers = helpers.setHeaders(req);
  const idNumber = req.yar.get('idNumber');
  async.parallel({
    personalData: (callback: any) => infoService.personalInfo(idNumber, headers, callback),
    addionalInfo: (callback: any) => infoService.addicionalInfo(headers, callback),
  }, (err: any, responses: any) => {
    if (err) {
      return callback(err);
    }
    console.log("response", responses);
    return callback(err, responses);
  });
};

【讨论】:

  • 解决方案完美,非常感谢(我只需要在“getInfo”函数中添加“=>”)
  • 是的,错过了,已编辑答案。很高兴它有帮助。
【解决方案2】:

我认为问题在于您返回响应的方式,我认为您应该将响应传递给回调

const getInfo = (req: Request | any, reply: any, callback: any): void => {
  const headers = helpers.setHeaders(req);
  const idNumber = req.yar.get("idNumber");
  async.parallel(
    {
      personalData: (callback: any) =>
        infoService.personalInfo(idNumber, headers, callback),
      addionalInfo: (callback: any) =>
        infoService.addicionalInfo(headers, callback),
    },
    callback // this is better
  );
};

【讨论】:

  • 是的,我也认为是我如何返回它的问题,我尝试了回调,但没有,信息属性没有出现在对象中并且它没有给出任何错误,谢谢
  • 从哪里调用 renderRecoveryData 函数。
  • 它是从打字稿路由文件中调用的,我更新了问题
猜你喜欢
  • 2017-02-15
  • 2020-10-25
  • 2016-04-28
  • 2015-03-21
  • 2016-05-30
  • 2013-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多