Node.js nodejs中带promise的导出函数

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

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

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);
})
我尝试按如下方式导入它:

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);
})

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

  • 传入回调以在异步代码中运行
  • 使用承诺来解决或拒绝承诺
  • 在函数前面使用async关键字,并将wait放在异步代码前面
  • 话虽如此,我还是能够通过运行一个命令来让代码正常工作,我只是稍微修改了一下您的代码,以便从服务器得到响应

    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;
    
    
    

    更改
    模块。导出
    导出…
    :@Marc谢谢!我不得不将整个导出更改为“export function”语法,但这似乎奏效了!结果仍然没有定义,但至少现在我得到了回应!你好,麦迪!谢谢你!有没有办法让function.js只包含一个函数,然后在index.js文件中调用承诺?我试图这样做,但收到一条错误消息:error[ERR_MODULE_NOT_FOUND]:找不到从C:\xampp\htdocs\NodeAPI\functions.jsp.s导入的包“axios”。当我尝试运行您编写的代码时,我也收到了错误消息:error[ERR_MODULE_NOT_FOUND]:找不到从C:\xampp\htdocs\NodeAPI\functions导入的包“axios”。jsAxios是承诺要解析或拒绝的异步代码。如果将axios移动到index.js文件,则为是。至于第二个回复mkae,请确保您安装了axios软件包。我通过您的方式获得了正确的响应。然后,我试图以此为基础,从函数文件中获得承诺,但是当我调用函数时得到的响应是“未定义的”(我甚至没有得到在catch中插入的错误消息)。我用自己编写的新代码更新了原来的帖子,但我找不到问题所在。既然我使用了OkapiKey.那么我就不需要使用“wait”对吗?为了使用wait,你必须使用一个异步函数。IDE应该抛出一个错误或警告,指示语法为invaild。下面是我模拟的几个示例,帮助您理解async并等待。