Я пишу свой первый пакет node.js, чтобы упростить использование REST API, и у меня возникли проблемы с форматированием пакета, чтобы позволить человеку, использующему пакет, сделать ниже их применения.Как написать установку для пакета NPM
var Water= require("water-reservation");
var water = Water({username: myusername, password: mypassword});
// Problem here because Water({}) needs to do a REST call to get a bearer
// token to use the API I am trying to simplify. Thus, it tries to
// get_water(callabck) before the bearer_token var is set in my package.
water.get_water(function(err, result){
if(err){
console.log(err);
console.log("----------------------------------------------");
}
else{
console.log(result);
console.log("----------------------------------------------");
}
});
В моей текущей настройки я взять имя пользователя и пароль пользователя и передать его в REST конечной точки, чтобы получить маркер носителя, который я использую во всех моих REST требует пакета. Асинхронный характер вызовет get_water в файле пользователя, прежде чем я закончу настройку переменной bearer_token в моем пакете.
Вот что мой пакет выглядит следующим образом:
var request = require('request');
var bearer_token = "";
var api_url = "";
var Water = function(credentials){
api_url = credentials.api_url;
var username = credentials.username;
var password = credentials.password;
get_bearer_token(username, password, function(err, access_token){
bearer_token = access_token;
});
};
function get_bearer_token(username, password, callback){
var request_options = {
url: api_url + "/auth",
method: "GET",
'auth': {
'user': username,
'pass': password
}
};
request(request_options, function(err, res, body){
if(err) {
return callback("Water Initialization Error: " + err, null);
}
else {
return callback(null, body);
}
});
}
// Get water
Water.prototype.get_water = function(callback) {
var request_options = {
url: api_url + "/water",
method: "GET",
'auth': {
'bearer': bearer_token
}
};
request(request_options, function(err, res, body){
if(err) {
return callback(err, null);
}
else{
return callback(null, body);
}
});
};
// more package functions...
module.exports = Water;
Я пытаюсь найти способ, чтобы сделать установку, так что пользователь может использовать пакет, как описано выше. Я не настроен на этот стиль, но, по-видимому, он проще всего понять и использовать.
Единственный способ, которым я мог подумать об исправлении этого вопроса, - это добавить обратный вызов для воды ({}), но это сделало бы большой беспорядок, когда пользователь обернул бы весь свой связанный с водой код в обратном вызове. Я знаю, что это можно сделать, если посмотреть на пакет Twitter, например, но я все равно могу обдумать, как они это сделали. Любая помощь будет оценена, спасибо.
Нода '-twitter' пакет, кажется, не делать какие-либо асинхронные запросы в функции прототипа. – gnerkus
Возможно, я должен предоставить пользователю свой токен-носитель и не выполнять запрос на отдых в настройке. Хотя, я бы предпочел быть полезным, получив для них токен, чтобы упростить использование пакета. –