Ошибка You have tried to call .then(), .catch()
Вложений: 4
Вопрос.
1. В чём причина проблемы? 2. Как исправить проблему? У меня есть проект, я хочу его запустить. Проект располагается в папке `e:\Test\Pro01\`. Я выполнил: - открыл консоль Windows; - ввёл команду `cd e:\Test\Pro01\`; - ввёл команду `node app.js`; - результат: я получаю сообщение об ошибке; Использую: - Windows-10x64; - VSCode; - Visual Studio 2022 Community(Установлено NodeJS); - Node.js (c:\Program Files\nodejs\node.exe); - Wampserver64; - MySql; Сообщение об ошибке e:\Test\Pro01>node app.js Start at http://localhost:3000 You have tried to call .then(), .catch(), or invoked await on the result of query that is not a promise, which is a programming error. Try calling con.promise().query(), or require('mysql2/promise') instead of 'mysql2' for a promise-compatible version of the query interface. T o learn how to use async/await or Promises check out documentation at https://www.npmjs.com/package/mysql2...romise-wrapper, or the mysql2 documentation at https://github.com/sidorares/node-my...ise-Wrapper.md e:\Test\Pro01\node_modules\mysql2\lib\commands\que ry.js:41 throw new Error(err); ^ Error: You have tried to call .then(), .catch(), or invoked await on the result of query that is not a promise, which is a programming error. Try calling con.promise().query(), or require('mysql2/promise') instead of 'mysql2' for a promise-compatible version of the query interface. To learn how to use async/await or Promises check out documentation at https://www.npmjs.com/package/mysql2...romise-wrapper, or the mysql2 documentation at https://github.com/sidorares/node-mysql2/tr /mast /documenta../Promise-Wrapper.md at Query.then (e:\Test\Pro01\node_modules\mysql2\lib\commands\qu ery.js:41:11) at MySQLStore.query (e:\Test\Pro01\node_modules\express-mysql-session\index.js:392:12) at MySQLStore.<anonymous> (e:\Test\Pro01\node_modules\express-mysql-session\index.js:110:9) at FSReqCallback.readFileAfterClose [as oncomplete] (node:internal/fs/read_file_context:68:3) Node.js v18.7.0 e:\Test\Pro01>[/i] ![]() ![]() ![]() ![]() app.js const express = require("express"); const bodyParser = require("body-parser"); const flash = require("connect-flash"); const expressSession = require("express-session"); const MySQLStore = require("express-mysql-session")(expressSession); const connection = require("./db/connection"); const helpers = require("./helpers"); const config = require("./config.json"); const moment = require("moment"); const passport = require("passport"); const LocalStrategy = require("passport-local").Strategy; const crypto = require("crypto"); const cookieParser = require("cookie-parser"); moment.locale("ru"); const app = express(); let listener = require("http").Server(app); passport.serializeUser(function (user, done) { done(null, user.id); }); passport.deserializeUser(function (id, done) { connection.query("select * from users where id = " + id, (err, rows) => { done(err, rows[0]); }); }); passport.use( "local-signup", new LocalStrategy( { usernameField: "email", passwordField: "password", passReqToCallback: true, }, (req, email, password, done) => { connection.query( "select * from users where email = ?", [email], (err, rows) => { if (err) { return done(err); } if (rows.length) { return done( null, false, req.flash("signupMessage", "That email is already taken.") ); } else { // create the user crypto.pbkdf2( password, email, 25000, 512, "sha256", (err, hash) => { let newUserMysql = new Object(); newUserMysql.email = email; newUserMysql.password = hash.toString("hex"); connection.query( "INSERT INTO users (email, password) values (?, ?)", [newUserMysql.email, newUserMysql.password], (err, rows) => { newUserMysql.id = rows.insertId; return done(null, newUserMysql); } ); } ); } } ); } ) ); passport.use( "local-login", new LocalStrategy( { usernameField: "email", passwordField: "password", passReqToCallback: true, }, (req, email, password, done) => { connection.query( "SELECT * FROM `users` WHERE `email` = ?", [email], (err, rows) => { if (err) { return done(err); } if (!rows.length) { return done( null, false, req.flash("loginMessage", "No user found.") ); } crypto.pbkdf2(password, email, 25000, 512, "sha256", (err, hash) => { password = hash.toString("hex"); if (!(rows[0].password == password)) { return done( null, false, req.flash("loginMessage", "Oops! Wrong password.") ); } }); return done(null, rows[0]); } ); } ) ); const routes = require("./routes.js")(express.Router(), passport); app .use( express.static("static", { maxage: "4h", }) ) .use(cookieParser()) /*.use(i18n.init)*/ .set("view engine", "ejs") .use(bodyParser.json()) .use( bodyParser.urlencoded({ extended: true, }) ) .use( expressSession({ secret: config.express.secret, store: new MySQLStore({}, connection), resave: false, saveUninitialized: false, }) ) .use(passport.initialize()) .use(flash()) .use(passport.session()) .use(async (req, res, next) => { res.locals.error = null; res.locals.helpers = helpers; res.locals.user = null; res.locals.moment = moment; res.locals.url = req.url; next(); }) .use(routes) .use((req, res, next) => { let err = new Error("Здесь ничего нет"); err.status = 404; next(err); }) .use((err, req, res, next) => { if (err.status != 404) { err.message = "Неизвестная ошибка"; } return res.status(err.status || 500).render("error", { message: err.message, error: req.app.get("env") === "development" ? err : null, status: err.status || 500, }); }); let server = listener.listen(config.express.port || 3000, () => { const host = server.address().address == "::" ? "localhost" : server.address().address; const port = server.address().port; console.log("Start at http://%s:%s", host, port); }); config.js var config = { express: { secret: 'cfgdgN1D798646fg5dFypV3HsB4g7m9', port: 3000, domain: 'http://localhost:3000', path: 'C:/server', } } module.exports = config; config.json { "mysql": { "host": "localhost", "user": "root", "password": "", "db": "polimedia5" }, "express": { "secret": "dgdf98dfg7d98tc6dSJEv4986VVF", "port": 3000 } } routes.js const multer = require('multer'); const rand = require('randomstring'); const filesStorage = multer.diskStorage({ destination: (req, file, next) => { next(null, 'static/uploads/files'); }, filename: (req, file, next) => { const ext = file.originalname.split('.').pop(); next(null, rand.generate({ length: 32, charset: 'alphabetic' }) + '.' + ext); } }); const filesUpload = new multer({ storage: filesStorage }); const site = { main: require('./controllers/main') }; const cms = { articles: require('./controllers/cms/articles'), files: require('./controllers/cms/files'), lang: require('./controllers/cms/lang'), slideshow: require('./controllers/cms/slideshow') }; module.exports = (app, passport) => { app .get('/', site.main.lang) .get('/video', site.main.video) .get('/slideshow', site.main.slideshow) .get('/:lang', site.main.index) .get('/:lang/articles', site.main.index) .get('/:lang/articles/:id', site.main.article) .get('/:lang/panomuseum', site.main.panomuseum) .get('/:lang/panomuseum/2', site.main.panomuseum2) .get('/:lang/panotheatre', site.main.panotheatre); app .get('/cms/lang', cms.lang.index) .post('/cms/lang', filesUpload.any(), cms.lang.save) .get('/cms/:lang/articles', cms.articles.index) .post('/cms/articles/saveOrder', cms.articles.saveOrder) .get('/cms/:lang/articles/add', cms.articles.add) .post('/cms/:lang/articles/add', filesUpload.any(), cms.articles.postAdd) .get('/cms/:lang/articles/:id/edit', cms.articles.edit) .post('/cms/:lang/articles/:id/edit', filesUpload.any(), cms.articles.postEdit) .get('/cms/:lang/articles/:id/delete', cms.articles.delete) .get('/cms/:lang/articles/:id', cms.articles.subArticle) .get('/cms/:lang/articles/add/:id', cms.articles.add) .post('/cms/files/delete', cms.files.delete) .post('/cms/files/saveFile', filesUpload.single('file'), cms.files.saveFile) .post('/cms/files/saveThumb', filesUpload.single('thumb'), cms.files.saveThumb) .get('/cms/slideshow', cms.slideshow.index) .post('/cms/slideshow/save', filesUpload.any(), cms.slideshow.save); return app; }; |
..\controllers\main.js
const db = require('../db'); const fs = require('fs'); const path = require('path'); const config = require('../config.js'); class Main { async video(req, res, next) { const videoFolder = './static/video' let videos = [] fs.readdirSync(videoFolder).forEach((file) => { let extension = path.extname(file) let filename = path.basename(file, extension) videos.push({ file, filename: parseInt(filename), }) }) videos = videos.sort((a, b) => { return a.filename - b.filename }) return res.render('video', { domain: config.express.domain, videos, }) } async panomuseum(req, res) { const article = await db.article.getByID(req.params.lang); const sub = await db.article.getRoot(req.params.lang); const files = await db.files.getByOwnerId(req.params.lang); const lang = await db.lang.getById(req.params.lang); return res.render('panomuseum', { article, sub, files, lang }); } async panomuseum2(req, res) { const article = await db.article.getByID(req.params.lang); const sub = await db.article.getRoot(req.params.lang); const files = await db.files.getByOwnerId(req.params.lang); const lang = await db.lang.getById(req.params.lang); return res.render('panomuseum2', { article, sub, files, lang }); } async panotheatre(req, res) { const article = await db.article.getByID(req.params.lang); const sub = await db.article.getRoot(req.params.lang); const files = await db.files.getByOwnerId(req.params.lang); const lang = await db.lang.getById(req.params.lang); return res.render('panotheatre', { article, sub, files, lang }); } async index(req, res) { const article = await db.article.getByID(req.params.lang); const sub = await db.article.getRoot(req.params.lang); const files = await db.files.getByOwnerId(req.params.lang); const lang = await db.lang.getById(req.params.lang); const timeout = await db.settings.getByID("timeout"); const caption = await db.settings.getByID("caption"); return res.render("index", { article, sub, files, lang, timeout, caption, domain: req.app.get("domain"), }); } async menu(req, res) { return res.render("menu", { domain: req.app.get("domain"), }); } async slideshow(req, res) { const slideshow = await db.files.getSlideshow(); const timer = await db.settings.getByID("timer"); return res.render("slideshow", { slideshow, timer, domain: req.app.get("domain"), }); } async slide(req, res) { const slideshow = await db.files.getByID(req.params.id); const timer = await db.settings.getByID("timer"); return res.render("slideshow", { slideshow: [slideshow], timer, domain: req.app.get("domain"), }); } async article(req, res) { const article = await db.article.getByID(req.params.id); const sub = await db.article.getSub(req.params.id); const files = await db.files.getByOwnerId(req.params.id); const id = req.params.id; const lang = await db.lang.getById(req.params.lang); const timeout = await db.settings.getByID("timeout"); const caption = await db.settings.getByID("caption"); return res.render("index", { id, article, sub, files, lang, timeout, caption, domain: req.app.get("domain"), }); } async lang(req, res) { const langs = await db.lang.getAll(); let activeCount = 0; for (let lang of langs) { if (lang.value == 1) { activeCount++; } } if (activeCount == 0) { return res.redirect("/0"); } else if (activeCount == 1) { for (let lang of langs) { if (lang.value == 1) { return res.redirect("/" + lang.id); } } } const timeout = await db.settings.getByID("timeout"); return res.render("lang", { langs, timeout, }); } async openSlide(req, res) { console.log("openSlide"); let files = await db.files.getSyncSmartHome(); parentIO.sockets.in("client").emit("goToUrl", { message: "/slide/" + files[parseInt(req.params.id)].id, }); return res.json({ success: true, }); } async openSlideshow(req, res) { console.log("open slideshow"); parentIO.sockets.in("client").emit("goToUrl", { message: "/slideshow", }); return res.json({ success: true, }); } } module.exports = new Main(); |
Тебе английским языком написано в чём проблема.
|
Цитата:
Как выявить место ошибки? Я только разбираюсь с NODE JS... Буду признателен за любую помощь… Владею на начальном уровне C#(ASP.NET(MVC)) |
Хз, сам смотри: https://nodejs.org/ru/docs/guides/de...tting-started/
Также я заменил у тебя node 18 - поставь node 16 lts. То что не lts - это бета-тестирование на юзерах, может отваливаться на каждом чихе. |
Цитата:
Вопросы. 1. При установке поле "Automatically install the necessary tools" нужно активировать? 2. Может комп перезагружать нужно до(после) удаления(установки)? Детали. Cообщение об ошибке. E:\>cd e:\Test\Pro01\ e:\Test\Pro01>node app.js Start at http://localhost:3000 You have tried to call .then(), .catch(), or invoked await on the result of query that is not a promise, which is a programming error. Try calling con.promise().query(), or require('mysql2/promise') instead of 'mysql2' for a promise-compatible version of the query interface. To learn how to use async/await or Promises check out documentation at https://www.npmjs.com/package/mysql2...romise-wrapper, or the mysql2 documentation at https://github.com/sidorares/node-my...ise-Wrapper.md e:\Test\Pro01\node_modules\mysql2\lib\commands\que ry.js:41 throw new Error(err); ^ Error: You have tried to call .then(), .catch(), or invoked await on the result of query that is not a promise, which is a programming error. Try calling con.promise().query(), or require('mysql2/promise') instead of 'mysql2' for a promise-compatible version of the query interface. To learn how to use async/await or Promises check out documentation at https://www.npmjs.com/package/mysql2...romise-wrapper, or the mysql2 documentation at https://github.com/sidorares/node-my...ise-Wrapper.md at Query.then (e:\Test\Pro01\node_modules\mysql2\lib\commands\qu ery.js:41:11) at MySQLStore.query (e:\Test\Pro01\node_modules\express-mysql-session\index.js:392:12) at MySQLStore.<anonymous> (e:\Test\Pro01\node_modules\express-mysql-session\index.js:110:9) at FSReqCallback.readFileAfterClose [as oncomplete] (node:internal/fs/read_file_context:68:3) e:\Test\Pro01>node -v v16.16.0 e:\Test\Pro01> Выполнил: - Удалил Node.js v18.7.0; - Скачал Latest LTS Version: 16.16.0. https://nodejs.org/en/download/; - Запустил установщик node-v16.16.0-x64.msi; Во время установки Node поле: "Automatically install the necessary tools. Note that this will also install Chocolatey. The script will pop-up in a new window after the installation completes." установил false. - Node JS- установилaсь; - открыл cmd Windows; - ввёл команду `cd e:\Test\Pro01\`; - ввёл команду `node app.js`; - результат: сообщение об ошибке; ![]() |
"necessary tools" - это мусор всякий, оно не надо.
Раз смена версии не повлияла - значит скорее всего не в ней дело. Иди по ссылке что я указал и изучай как дебажить node js. |
Я практически уверен, что проблема в строках:
const article = await db.article.getByID(req.params.lang); Скорее всего "db.article.getByID" не возвращает экземпляр промиса, поэтому await к нему не применим. |
Aetae,
Понятно... Буду разбираться... По выложенному коду можете дать условную оценку проекту по 5-ти бальной шкале? 0 - плохо. 5 - хорошо. Ну есть такое, что прямо режет глаза ? Или то, что вы сделали бы по другому? Может есть что не практикуется? Например мне как НЕспециалисту кажется не нормальным: 1. длинные файлы(много строк); 2. В файле .../views/index.ejs теги <style>....</style> <script>...</script> в одном с HTML. Это нормально? Или в NODE JS такое практикуется? |
Часовой пояс GMT +3, время: 00:38. |