Call another function within same EJS file

405 Views Asked by At

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.

2

There are 2 best solutions below

2
On BEST ANSWER

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);
}
1
On

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.