1

I was trying to call another function which is in same ejs file.

async function (request, state, logger) {
    var fs = require('fs');
    var path = require('path');
    var util = require('util');
    var response;
    var RspFilename = "my-success.xml";
    var responsepath = path.join('ConfigFiles', 'Responses', 'ABS', RspFilename);
    response = fs.readFileSync((responsepath), 'utf8');

    await this.sleep(1000);
    return {
        headers: {
            "HTTP-Response-Code": 200,
            "HTTP-Response-Code-Text": "OK",
            "Content-Type": "text/xml"
        },
        "statusCode": "200",
        body: response
    };
}


function sleep(ms) {
    return new Promise((resolve) => {
        setTimeout(resolve, ms);
    });
} 

I am trying this mountebank. When call the endpoint I get below error though

{
    "errors": [
        {
            "code": "invalid injection",
            "message": "invalid response injection",
            "source": "(async function (request, state, logger) {\n    var fs = require('fs');\n    var path = require('path');\n    var util = require('util');\n    var response;\n    var RspFilename = \"my-success.xml\";\n    var responsepath = path.join('ConfigFiles', 'Responses', 'ABS', RspFilename);\n    response = fs.readFileSync((responsepath), 'utf8');\n\n    logger.info(\"---------Response Sent Successfully--------\" + RspFilename + response);\n    await this.sleep(1000);\n    return {\n        headers: {\n            \"HTTP-Response-Code\": 200,\n            \"HTTP-Response-Code-Text\": \"OK\",\n            \"Content-Type\": \"text/xml\"\n        },\n        \"statusCode\": \"200\",\n        body: response\n    };\n}\n\n\nfunction sleep(ms) {\n    return new Promise((resolve) => {\n        setTimeout(resolve, ms);\n    });\n})(scope, injectState, logger, deferred.resolve, imposterState);",
            "data": "Unexpected token function",
            "name": "Error",
            "stack": "Error\n    at Object.from (C:\\Repo\\mountebank\\src\\util\\inherit.js:15:17)\n    at createError (C:\\Repo\\mountebank\\src\\util\\errors.js:10:26)\n    at Object.InjectionError (C:\\Repo\\mountebank\\src\\util\\errors.js:25:16)\n    at inject (C:\\Repo\\mountebank\\src\\models\\responseResolver.js:43:44)\n    at processResponse (C:\\Repo\\mountebank\\src\\models\\responseResolver.js:243:20)\n    at Object.resolve (C:\\Repo\\mountebank\\src\\models\\responseResolver.js:277:16)\n    at Object.resolve (C:\\Repo\\mountebank\\src\\models\\stubRepository.js:136:25)\n    at F.respond (C:\\Repo\\mountebank\\src\\models\\http\\baseHttpServer.js:94:34)\n    at C:\\Repo\\mountebank\\src\\models\\abstractServer.js:105:39\n    at _fulfilled (C:\\Repo\\mountebank\\node_modules\\q\\q.js:854:54)"
        }
    ]
}

Actually my requirement is to add some delay for the response.

BTW I tried Mountebank wait, but couldn't see any delay.

Shabar
  • 2,617
  • 11
  • 57
  • 98
  • I've never used mountebank, but `sleep` has been declared in scope of that file, hasn't it? Can't you just call `sleep(1000)` without `this`? – DustInComp Nov 24 '21 at 12:03
  • @DustInCompetent I tried `await sleep(1000); ` same result though. – Shabar Nov 24 '21 at 12:10

2 Answers2

1

Following the code examples on http://www.mbtest.org/docs/api/injection, It seems, mountebank doesn't expect anything to follow the single anonymous function, hence "Unexpected token function" when it starts reading function sleep.

Try moving sleep into the other function. Not far off, since you've already done the same with module imports:

async function (request, state, logger) {
    // ...
    function sleep(ms) {
        return new Promise((resolve) => {
            setTimeout(resolve, ms);
        });
    } 

    await sleep(1000);
    // ...
}

Or simply

async function (request, state, logger) {
    // ...
    await new Promise(resolve => setTimeout(resolve, 1000));
    // ...
}

Or, simplifying the whole function

function (request, state, logger) {
    // ...
    return new Promise(resolve => setTimeout(() => {
        resolve({
            headers: // ...

        })
    }, 1000);
}
DustInComp
  • 1,742
  • 8
  • 18
0

You're declaring a function but forgot to give it a name on line 1.

If you meant to define an anonymous function rather than make a async function statement, you need to wrap it in parentheses.

DustInComp
  • 1,742
  • 8
  • 18
  • Tried this as well `(async function (request, state, logger) { ... await sleep(10000); .... body: response }; })(); function sleep(ms) { ... } ` I believe `async` hast be there as we call wait function – Shabar Nov 24 '21 at 13:11