#node.js #function #import #promise
#node.js #функция #импорт #обещание
Вопрос:
Я пытаюсь импортировать функцию из имеющегося у меня внешнего файла, который содержит обещание. Разрешение обещания — это то, что должно быть возвращено, но я получаю сообщение об ошибке: запрошенный модуль ‘. /functions.js ‘не предоставляет экспорт с именем ‘getOkapiToken’ Запрос POST работает нормально, когда я запускаю его непосредственно на сервере, но мне он нужен в отдельном файле, так как он будетв будущем будет использоваться несколькими разными файлами. Я также впервые использую обещания, поэтому я не уверен, что справился с этим правильно (хотя я не могу зарегистрировать какие-либо ошибки, пока не разберусь с первой).
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);
})
Комментарии:
1. Изменить
module.export
наexport ...
: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference /…2. @Marc Спасибо! Мне пришлось изменить весь экспорт на синтаксис «функции экспорта», но, похоже, это сработало! Результат все еще не определен, но, по крайней мере, теперь я получаю ответ!
Ответ №1:
Существует три способа обработки асинхронной задачи в Javascript и wit Node.JS
- Передайте обратный вызов для запуска в асинхронном коде
- Используйте обещание, которое либо разрешит, либо отклонит обещание
- Используйте ключевое слово async перед функцией и поместите await перед асинхронным кодом.
С учетом сказанного я смог заставить код работать, запустив простой сервер узлов, и я немного изменил ваш код, чтобы получить ответ от сервера.
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;
Комментарии:
1. Привет, @meddy! Спасибо за это! Есть ли способ сохранить function.js используя только функцию, затем вызовите обещание в index.js файл? Я пытался это сделать, но получил сообщение об ошибке: Ошибка [ERR_MODULE_NOT_FOUND]: не удается найти пакет ‘axios’, импортированный из C:xampphtdocsNodeAPIfunctions.js
2. ps. Я также получаю это сообщение об ошибке, когда пытаюсь запустить написанный вами код: Ошибка [ERR_MODULE_NOT_FOUND]: не удается найти пакет ‘axios’, импортированный из C:xampphtdocsNodeAPIfunctions.js
3. Axios — это асинхронный код, который обещание должно разрешить или отклонить. Если вы переместите axios в index.js файл, тогда да. Что касается второго ответа, убедитесь, что у вас установлен пакет axios.
4. Мне удалось получить правильный ответ так, как вы это сделали. Затем я попытался использовать это, чтобы получить обещание из файла функции, но ответ, который я получаю при вызове функции, «не определен» (я даже не получаю сообщение об ошибке, которое я вставил в catch). Я обновил исходное сообщение новым созданным мной кодом, но не могу найти проблему. Поскольку я использую OkapiKey. тогда мне не нужно использовать «await», верно?
5. Чтобы использовать await, вы должны использовать асинхронную функцию. Ваша среда разработки должна выдать ошибку или предупреждение, указывающее, что синтаксис неверен. Вот несколько примеров, которые я смоделировал, чтобы помочь вам понять асинхронность и ожидание. Смотрите пример