28.07.2022, 17:23
|
Интересующийся
|
|
Регистрация: 28.07.2022
Сообщений: 16
|
|
Ошибка You have tried to call .then(), .catch()
Вопрос.
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;
};
Последний раз редактировалось Ivan65913, 29.07.2022 в 19:25.
|
|
28.07.2022, 17:24
|
Интересующийся
|
|
Регистрация: 28.07.2022
Сообщений: 16
|
|
..\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();
|
|
29.07.2022, 06:22
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,590
|
|
Тебе английским языком написано в чём проблема.
__________________
29375, 35
|
|
29.07.2022, 07:27
|
Интересующийся
|
|
Регистрация: 28.07.2022
Сообщений: 16
|
|
Сообщение от Aetae
|
Тебе английским языком написано в чём проблема.
|
С какой стороны хоть поступится?
Как выявить место ошибки?
Я только разбираюсь с NODE JS...
Буду признателен за любую помощь…
Владею на начальном уровне C#(ASP.NET(MVC))
|
|
29.07.2022, 08:08
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,590
|
|
Хз, сам смотри: https://nodejs.org/ru/docs/guides/de...tting-started/
Также я заменил у тебя node 18 - поставь node 16 lts. То что не lts - это бета-тестирование на юзерах, может отваливаться на каждом чихе.
__________________
29375, 35
|
|
29.07.2022, 08:50
|
Интересующийся
|
|
Регистрация: 28.07.2022
Сообщений: 16
|
|
Ошибка осталась
Вопросы.
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`;
- результат: сообщение об ошибке;
Последний раз редактировалось Ivan65913, 29.07.2022 в 09:04.
|
|
29.07.2022, 13:40
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,590
|
|
"necessary tools" - это мусор всякий, оно не надо.
Раз смена версии не повлияла - значит скорее всего не в ней дело. Иди по ссылке что я указал и изучай как дебажить node js.
__________________
29375, 35
|
|
29.07.2022, 14:22
|
Профессор
|
|
Регистрация: 04.12.2012
Сообщений: 3,795
|
|
Я практически уверен, что проблема в строках:
const article = await db.article.getByID(req.params.lang);
Скорее всего "db.article.getByID" не возвращает экземпляр промиса, поэтому await к нему не применим.
|
|
29.07.2022, 14:37
|
Интересующийся
|
|
Регистрация: 28.07.2022
Сообщений: 16
|
|
Aetae,
Понятно... Буду разбираться...
По выложенному коду можете дать условную оценку проекту по 5-ти бальной шкале?
0 - плохо.
5 - хорошо.
Ну есть такое, что прямо режет глаза ?
Или то, что вы сделали бы по другому?
Может есть что не практикуется?
Например мне как НЕспециалисту кажется не нормальным:
1. длинные файлы(много строк);
2. В файле .../views/index.ejs теги <style>....</style> <script>...</script> в одном с HTML.
Это нормально?
Или в NODE JS такое практикуется?
|
|
|
|