首页 > 解决方案 > 我对 API Post 的调用有时似乎不起作用。节点.js

问题描述

因此,例如,如果我想从 API 获取数据,我需要运行一些名为 signon 的 API 来获取唯一令牌,然后使用 unqiue 令牌进行登录以获取登录会话令牌,因此或多或少是这样的顺序:

  1. 登录(获取唯一令牌/authsalt,用于登录 API)
  2. 登录(获取 idmitra {用于下一个进程},会话令牌)
  3. 做其他事情(例如,获取用户数据等)
  4. 等等。

问题是。代码有时有效,但有时无效

错误]([![https://imgur.com/sg2C1AO] 1 )

例如在这张图片中,我运行它的前 3 次,它不会从登录过程中获取 idmitra。

我想知道问题出在服务器端还是在它的编码中

这是 index.js 中的编码

const request = require('request');
const crypto = require('crypto');

const baseUrl = "https://linktoAPIserver";
const username = "theuser", password = "thepassword";

async function syncData() {
    let authSalt = "", token = "";

    return new Promise(resolve => {
        // sign on, get auth salt
        request.post(baseUrl + '/api/member/signon',
            { form: { devid: '12345678' } },
            function (error, response, body) {
                if (!error && response.statusCode == 200) {
                    const data = JSON.parse(body);
                    // return authsalt for next process
                    resolve(data.authsalt);
                }
            })
    }).then(salt => {
        const hashedPassword = crypto.createHash('sha256').update(password + salt).digest('hex');
        // login, get token
        return new Promise(resolve => {
            request.post(baseUrl + '/api/member/login',
                {
                    form: {
                        username: username,
                        password: hashedPassword,
                        devid: 12345678,
                        hddinfo: 12345,
                        isbackend: 1
                    }
                },
                function (error, response, body) {
                    if (!error && response.statusCode == 200) {
                        const data = JSON.parse(body);
                        resolve({
                            idMitra: data.idmitra,
                            userKey: data.userkey,
                            // get last 8 character of id mitra
                            idMitra8: data.idmitra.slice(-8),
                        });
                    }
                })
        });
    }).then(userData => {
        const trxId = +new Date;
        const signature = crypto.createHash('sha256').update(userData.idMitra8 + trxId + userData.userKey).digest('hex');
        // get laporan transaksi
        return new Promise(resolve => {
            request.post(baseUrl + '/api/member/getlaporan',
                {
                    headers: {
                        sign: signature
                    },
                    form: {
                        idmitra: userData.idMitra,
                        trxid: trxId,
                        // TODO : set startDate and endDate as needed
                        tgl1: '2019-01-01',
                        tgl2: '2020-03-01',
                        produk: null
                    }
                },
                function (error, response, body) {
                    if (!error && response.statusCode == 200) {
                        const data = JSON.parse(body);
                        console.log(data);
                        resolve({ trxId, signature });
                    }
                })
        });
    }).then(authData => {
        console.log(authData);
    });
}

syncData();

任何形式的帮助将不胜感激

标签: javascriptnode.jsapipostrequest

解决方案


推荐阅读