【问题标题】:export function with promise in nodejsnodejs中带有promise的导出函数
【发布时间】:2020-11-10 09:33:23
【问题描述】:

我正在尝试从我拥有的外部文件中导入一个函数,其中包含一个承诺。 承诺的解决方案是应该返回的,但我收到一条错误消息: 请求的模块“./functions.js”不提供名为“getOkapiToken”的导出 当我直接在服务器中运行 POST 请求时,它可以正常工作,但我需要将它放在一个单独的文件中,因为将来它将被几个不同的文件使用。 这也是我第一次使用 Promise,所以我不确定我是否正确处理了它(尽管在处理第一个错误之前我无法注册任何错误)。

functions.js 文件构建如下:

import post from 'axios';

export function getOkapiToken(url, user, password) {
    //Get username and password for API
    const auth = {
      "username": user,
      "password": password
    };

    //Create headers for POST request
    const options = {
      method: 'post',
      data: auth,
      headers: {
        'Content-Type': 'application/json',
        'Content-Length': auth.length,
        'X-Okapi-Tenant': 'diku'
      }
    };
      //Make API post call
    post(url+':9130/authn/login', options)
        .then(response => {
          return(response.headers['x-okapi-token'])
        }).catch((err) => {
            return(`There was an error 2: ${err}`)
    })
  }

我尝试按如下方式导入它:

import { getOkapiToken } from './functions3.js'
import settings from './jsons/config.json';
let OkapiKey = await new Promise((resolve,reject) => {
  //Call function to make API post call  
  let keytoken = getOkapiToken(settings.url,settings.userauth,settings.passauth)
  console.log(`There was an error: ${keytoken}`)
  if (keytoken.length == 201) {
    resolve(keytoken)
  } else {
    reject('There was an error')
  }
})

OkapiKey.then((data) => {
  console.log(data)
})
.catch((err) => {
  console.error('I have an error:'+err.code);
})

【问题讨论】:

标签: node.js function import promise


【解决方案1】:

在 Javascript 和 Node.JS 中处理异步任务的三种方式

  1. 传入一个回调以在异步代码中运行
  2. 使用 Promise 来解决或拒绝承诺
  3. 在函数前面使用 async 关键字,并将 await 放在异步代码前面。

话虽如此,我可以通过运行simple node server 使代码正常工作,并且我稍微修改了您的代码以从服务器获得响应。

index.js

const  { getOkapiToken } = require('./functions.js')
const settings = require('./settings.json')
var OkapiKey = getOkapiToken(settings.url,settings.userauth,settings.passauth)
OkapiKey
.then((data) => {
  console.log('I have data'+ data.toString())
})
.catch((err) => {
  console.error('I have an error:'+err.code);
})

functions.js

const post  = require('axios');

const getOkapiToken = (url, user, password) =>
    new Promise(function (resolve, reject) {

      //Get username and password for API
      const auth = {
        "username": user,
        "password": password
      };

      //Create headers for POST request
      const options = {
        method: 'post',
        data: auth,
        headers: {
          'Content-Type': 'application/json',
          'Content-Length': auth.length,
          'X-Okapi-Tenant': 'diku'
        }
      };

      post('http://localhost:3000/', options)
          .then(response => {
            resolve(response.data)
            // if (response.headers['x-okapi-token']) {
            //   resolve(response.headers['x-okapi-token']);
            // } else {
            //   reject((error));
            // }
          }).catch((err) => {
            console.error('Response Error:'+err)
      })
    })

exports.getOkapiToken = getOkapiToken;


【讨论】:

  • 嗨@meddy!感谢那!有没有办法让 function.js 只保留一个函数,然后在 index.js 文件中调用 promise?我尝试这样做,但收到一条错误消息:错误 [ERR_MODULE_NOT_FOUND]: 找不到从 C:\xampp\htdocs\NodeAPI\functions.js 导入的包 'axios'
  • 附注当我尝试运行您编写的代码时,我也收到了该错误消息:错误 [ERR_MODULE_NOT_FOUND]: 找不到从 C:\xampp\htdocs\NodeAPI\functions.js 导入的包 'axios'
  • axios 是 promise 要解析或拒绝的异步代码。如果您将 axios 移至 index.js 文件,则可以。至于第二个回复,请确保您已安装 axios 软件包。
  • 我设法用你的方式得到了正确的回应。然后我尝试在此基础上从函数文件中获取承诺,但是当我调用函数时得到的响应是“未定义”(我什至没有收到我插入的错误消息) .我用我构建的新代码更新了原始帖子,但我找不到问题。既然我用的是 OkapiKey,那我就不用“await”了吧?
  • 为了使用 await 你必须使用异步函数。您的 IDE 应抛出错误或警告,指示语法无效。这是我模拟的一些示例,以帮助您理解 async 和 await。 See Example
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-17
  • 1970-01-01
  • 1970-01-01
  • 2021-01-16
  • 1970-01-01
  • 2017-03-25
相关资源
最近更新 更多