【问题标题】:Node.js es6 module export async variableNode.js es6 模块导出异步变量
【发布时间】:2016-07-19 18:26:48
【问题描述】:

我已经使用supertest 实现了在用户登录后运行的测试:

// ../prepare.login
"use strict";

import {default as request} from "supertest";
import {default as app} from "../../server.js";

const postUrl = "/api/v1/login";
const postData = {
    "username": "user",
    "password": "pass"
    };

module.exports = {
    prepare: function(done) {
        request(app.listen())
            .post(postUrl)
            .send(postData)
            .end((err, res) => {
                if (err) {
                    throw err;
                }
                module.exports.token = res.body.token;
                done();
            });
    }
}

到目前为止,我一直在使用 es5 并使用 module.exports.token 作为一种丑陋的 hack 将令牌发送到实际测试:

// users.js
...
var login = require("../prepare.login");

describe("authenticated /api/v1/users", function() {
beforeEach(function(done) {
        login.prepare(done);
    });
});

...

it("On GET /api/v1/users I want to get all the users in an array", function(done) {
        request(app.listen())
            .get("/api/v1/users")
            .set("X-Access-Token", login.token)
            .expect(200)
            ...

我切换到 es6,它不允许在模块顶层以外的任何地方使用 importexport 语句。因此,我不确定这应该如何实现。我应该异步等待结果吗?甚至可能吗?有没有其他办法?

【问题讨论】:

    标签: node.js ecmascript-6


    【解决方案1】:

    es6 不允许在模块顶层以外的任何地方导入和导出语句

    是的,但这只是变量声明需要的地方。您仍然可以随心所欲地分配给他们。

    import {default as request} from "supertest";
    import {default as app} from "../../server.js";
    
    const postUrl = "/api/v1/login";
    const postData = {
        "username": "user",
        "password": "pass"
    };
    
    export let token = null;
    export function prepare(done) {
        request(app.listen())
            .post(postUrl)
            .send(postData)
            .end((err, res) => {
                if (err) return done(err);
                token = res.body.token;
                done();
            });
    }
    

    import {prepare, token} from "prepare.login";
    …
    

    还有其他方法吗?

    是的。与其改变全局变量(自古以来就被鄙视),不如将token 传递给回调:

    …
    .end((err, res) => {
        if (err) done(err);
        else done(null, res.body.token);
    });
    

    以便您可以在需要的地方提取它:

    let token = null;
    describe("authenticated /api/v1/users", function() {
        beforeEach(function(done) {
            login.prepare(function(err, t) {
                if (err) return done(err);
                token = t;
                done();
            });
        });
    });
    

    还有更好的方法吗?

    与第二种方法一样,不要使用导出的变量;但不要调用繁琐的回调,只需返回令牌的承诺。

    【讨论】:

      猜你喜欢
      • 2019-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-09
      • 2021-10-12
      相关资源
      最近更新 更多