строка перед вызовом функции asyn c - PullRequest
1 голос
/ 26 мая 2020

, поэтому я создаю несколько простых проектов узлов и делаю некоторые запросы, используя GOT , поскольку исходная библиотека запросов для узла прекращена, но эта странность продолжает происходить и вызывает все, что угодно перед asyn c функция как функция.

ниже - это код, который я запускаю

let express = require("express")
let app = express()
let bodyparser = require("body-parser")
const got = require('got');
app.set("view engine", "ejs")


app.get("/search", function(req, res){
    let query = req.query.pesq
    let url = "https://www.omdbapi.com/?s=" + query + "&apikey=thewdb"
    (async () => {
        try {
            const response = got(url);
            data = JSON.parse(response.body);
            console.log("fine here")
            res.render("search", {data: data})
            //=> '<!doctype html> ...'
        } catch (error) {
            console.log(error.code);
            //=> 'Internal server error ...'
        }
    })
})

app.listen(3000, function(){
    console.log("Server has started!")
})

И это ошибка, которую я получаю от него

TypeError: "&apikey=thewdb" is not a function
at /workspace/Bootcamp/MoviaApp/index.js:11:2
at Layer.handle [as handle_request] (/workspace/Bootcamp/MoviaApp/node_modules/express/lib/router/layer.js:95:5)
at next (/workspace/Bootcamp/MoviaApp/node_modules/express/lib/router/route.js:137:13)
at Route.dispatch (/workspace/Bootcamp/MoviaApp/node_modules/express/lib/router/route.js:112:3)
at Layer.handle [as handle_request] (/workspace/Bootcamp/MoviaApp/node_modules/express/lib/router/layer.js:95:5)
at /workspace/Bootcamp/MoviaApp/node_modules/express/lib/router/index.js:281:22
at Function.process_params (/workspace/Bootcamp/MoviaApp/node_modules/express/lib/router/index.js:335:12)
at next (/workspace/Bootcamp/MoviaApp/node_modules/express/lib/router/index.js:275:10)
at expressInit (/workspace/Bootcamp/MoviaApp/node_modules/express/lib/middleware/init.js:40:5)
at Layer.handle [as handle_request] (/workspace/Bootcamp/MoviaApp/node_modules/express/lib/router/layer.js:95:5)

Я пытаюсь найти выяснить, почему строка перед функцией asyn c вызывается как функция, как показывает ошибка. Я попытался добавить console.log("check") после let url и получил еще одну ошибку:

TypeError: console.log(...) is not a function
at /workspace/Bootcamp/MoviaApp/index.js:12:2
at Layer.handle [as handle_request] (/workspace/Bootcamp/MoviaApp/node_modules/express/lib/router/layer.js:95:5)
at next (/workspace/Bootcamp/MoviaApp/node_modules/express/lib/router/route.js:137:13)
at Route.dispatch (/workspace/Bootcamp/MoviaApp/node_modules/express/lib/router/route.js:112:3)
at Layer.handle [as handle_request] (/workspace/Bootcamp/MoviaApp/node_modules/express/lib/router/layer.js:95:5)
at /workspace/Bootcamp/MoviaApp/node_modules/express/lib/router/index.js:281:22
at Function.process_params (/workspace/Bootcamp/MoviaApp/node_modules/express/lib/router/index.js:335:12)
at next (/workspace/Bootcamp/MoviaApp/node_modules/express/lib/router/index.js:275:10)
at expressInit (/workspace/Bootcamp/MoviaApp/node_modules/express/lib/middleware/init.js:40:5)
at Layer.handle [as handle_request] (/workspace/Bootcamp/MoviaApp/node_modules/express/lib/router/layer.js:95:5)

Однако я понятия не имею, почему у него такое странное поведение при вызове линии раньше, вероятно, это что-то очень просто, но я не могу узнать. извините, если на этот вопрос уже был дан ответ, но я не могу найти ответ.

Обновление: добавлено await перед функцией got(url) и по-прежнему возвращается тот же результат

Ответы [ 3 ]

2 голосов
/ 27 мая 2020

Вы вызываете строку «& apikey = thewdb» как функцию.

Давайте немного изменим ваш код, чтобы ясно видеть это:

let url = "https://www.omdbapi.com/?s=" + query + "&apikey=thewdb"
(async () => { ...

это то же самое, что

let url = "https://www.omdbapi.com/?s=" + query + "&apikey=thewdb"(async () => ...

Давайте перепишем это, чтобы было действительно очевидно:

let callback = async () => {
    try {
        const response = got(url);
        data = JSON.parse(response.body);
        console.log("fine here")
        res.render("search", {data: data})
        //=> '<!doctype html> ...'
    } catch (error) {
        console.log(error.code);
        //=> 'Internal server error ...'
    }
}

let string = "&apikey=thewdb";

let url = "https://www.omdbapi.com/?s=";
url = url + query;
url = url + string(callback); // you are calling the string as a function

Очевидно, "&apikey=thewdb" не является функцией, поэтому интерпретатор жалуется, что "&apikey=thewdb" не является функцией.

НЕ просто пропускайте точки с запятой!

Если вам не нравятся точки с запятой, вы должны использовать стандартные. js правила. Вы не можете просто составить свои собственные правила, иначе вы столкнетесь с ошибками, подобными этой.

Если вам не нравится стандарт. js тогда вы должны использовать точки с запятой.

Альтернативного выбора нет.

Помните, что в javascript вы можете законно вызывать такую ​​функцию:

function foo () {
    console.log('foo is called');
}

foo

(
) // foo is called
1 голос
/ 26 мая 2020

Вы забыли вызвать свою асинхронную c функцию и забыли await при выполнении вызова:

let express = require("express")
let app = express()
let bodyparser = require("body-parser")
const got = require('got');
app.set("view engine", "ejs")


app.get("/search", function(req, res){
    let query = req.query.pesq
    let url = "https://www.omdbapi.com/?s=" + query + "&apikey=thewdb"
    (async () => {
        try {
            const response = await got(url);
            data = JSON.parse(response.body);
            console.log("fine here")
            res.render("search", {data: data})
            //=> '<!doctype html> ...'
        } catch (error) {
            console.log(error.code);
            //=> 'Internal server error ...'
        }
    })()
})

app.listen(3000, function(){
    console.log("Server has started!")
})
0 голосов
/ 27 мая 2020

Я решил, поставив ";" в конце

let url = ("https://www.omdbapi.com/?s=" + query + "&apikey=thewdb")

, поэтому он стал

    let url = ("https://www.omdbapi.com/?s=" + query + "&apikey=thewdb");

и работал нормально, вероятно, что-то связано с библиотекой express или самой Goorm IDE, но в любом случае это странно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...