Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 28.07.2022, 17:23
Интересующийся
Отправить личное сообщение для Ivan65913 Посмотреть профиль Найти все сообщения от Ivan65913
 
Регистрация: 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;
};
Изображения:
Тип файла: jpg 27.07.2022_19-12-39.jpg (6.2 Кб, 0 просмотров)
Тип файла: jpg 27.07.2022_19-14-02.jpg (2.4 Кб, 0 просмотров)
Тип файла: jpg 27.07.2022_19-29-24.jpg (3.0 Кб, 0 просмотров)
Тип файла: jpg 27.07.2022_21-28-56.jpg (13.6 Кб, 2 просмотров)

Последний раз редактировалось Ivan65913, 29.07.2022 в 19:25.
Ответить с цитированием
  #2 (permalink)  
Старый 28.07.2022, 17:24
Интересующийся
Отправить личное сообщение для Ivan65913 Посмотреть профиль Найти все сообщения от Ivan65913
 
Регистрация: 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();
Ответить с цитированием
  #3 (permalink)  
Старый 29.07.2022, 06:22
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,590

Тебе английским языком написано в чём проблема.
__________________
29375, 35
Ответить с цитированием
  #4 (permalink)  
Старый 29.07.2022, 07:27
Интересующийся
Отправить личное сообщение для Ivan65913 Посмотреть профиль Найти все сообщения от Ivan65913
 
Регистрация: 28.07.2022
Сообщений: 16

Сообщение от Aetae Посмотреть сообщение
Тебе английским языком написано в чём проблема.
С какой стороны хоть поступится?
Как выявить место ошибки?

Я только разбираюсь с NODE JS...
Буду признателен за любую помощь…

Владею на начальном уровне C#(ASP.NET(MVC))
Ответить с цитированием
  #5 (permalink)  
Старый 29.07.2022, 08:08
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,590

Хз, сам смотри: https://nodejs.org/ru/docs/guides/de...tting-started/

Также я заменил у тебя node 18 - поставь node 16 lts. То что не lts - это бета-тестирование на юзерах, может отваливаться на каждом чихе.
__________________
29375, 35
Ответить с цитированием
  #6 (permalink)  
Старый 29.07.2022, 08:50
Интересующийся
Отправить личное сообщение для Ivan65913 Посмотреть профиль Найти все сообщения от Ivan65913
 
Регистрация: 28.07.2022
Сообщений: 16

Сообщение от Aetae Посмотреть сообщение
Хз, сам смотри: 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`;
- результат: сообщение об ошибке;



Последний раз редактировалось Ivan65913, 29.07.2022 в 09:04.
Ответить с цитированием
  #7 (permalink)  
Старый 29.07.2022, 13:40
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,590

"necessary tools" - это мусор всякий, оно не надо.

Раз смена версии не повлияла - значит скорее всего не в ней дело. Иди по ссылке что я указал и изучай как дебажить node js.
__________________
29375, 35
Ответить с цитированием
  #8 (permalink)  
Старый 29.07.2022, 14:22
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,795

Я практически уверен, что проблема в строках:
const article = await db.article.getByID(req.params.lang);

Скорее всего "db.article.getByID" не возвращает экземпляр промиса, поэтому await к нему не применим.
Ответить с цитированием
  #9 (permalink)  
Старый 29.07.2022, 14:37
Интересующийся
Отправить личное сообщение для Ivan65913 Посмотреть профиль Найти все сообщения от Ivan65913
 
Регистрация: 28.07.2022
Сообщений: 16

Aetae,
Понятно... Буду разбираться...

По выложенному коду можете дать условную оценку проекту по 5-ти бальной шкале?
0 - плохо.
5 - хорошо.

Ну есть такое, что прямо режет глаза ?
Или то, что вы сделали бы по другому?
Может есть что не практикуется?

Например мне как НЕспециалисту кажется не нормальным:
1. длинные файлы(много строк);
2. В файле .../views/index.ejs теги <style>....</style> <script>...</script> в одном с HTML.
Это нормально?
Или в NODE JS такое практикуется?
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка в коде, часть кода с ошибкой и сама ошибка ниже Сахар Node.JS 5 23.08.2021 21:08
Ошибка Uncaught TypeError: Cannot read property '1' of null? orb jQuery 12 18.11.2020 03:12
firebug пишет ошибка invalid range in character class Dim@ Общие вопросы Javascript 5 10.05.2012 16:52
метод call() - ошибка ( mrValter AJAX и COMET 1 31.07.2009 11:09
То-ли лыжи не едут, толи... возможно ошибка в коде. AzriMan Общие вопросы Javascript 19 18.05.2009 16:07