为什么我的查询没有等待就不能工作?如何修复 'query.orderBy' 不是函数?
Why won't my query work without await? How to fix 'query.orderBy' is not a function?
我正在使用 node.js、MySQL、knex 和 express。
我正在做一个简单的数据库查询,db.findAllEmoji()。
const findAllEmoji = () => {
return knex('emoji')
.select('*');
};
我正在使用我正在建模的以前的代码工作,但仍然卡住了。下面有两个大代码块第一个来自我在 routes\dashboard.js
中呈现页面的路线。第二个是我正在建模的。
下面第一个大代码块 return 中的内容未定义,除非我使用 let query = await db.findAllEmoji();
,只有这样才会 return 查询结果。那很好,但是...如果我使用 await,则 .whereRaw 和 .orderBy 会抛出这些错误,而我无法克服这些错误。这是其中之一。
TypeError: query.orderBy is not a function at C:\Users\pauli\repos\all-coursework-node-paulwinka\tests. MySQL database schema emoji\routes\dashboard.js:21:21 at processTicksAndRejections (internal/process/task_queues.js:97:5)
我的示例代码不需要 await 才能工作,所以我更喜欢一个解决方案,它可以弄清楚为什么我的查询在没有 await 的情况下无法工作......或者也许。
所以我的问题是,为什么没有 await 原始查询就不能工作...我怎样才能像在我的模型代码中那样在没有 await 的情况下让它工作?
如果在这种情况下我必须使用 await,我该如何修复 orderBy 不起作用的错误?
我只用了几个星期,还在摸索中。谢谢。 :)
const express = require('express');
const db = require('../db');
const debug = require('debug')('app:routes:dashboard');
// creating instance of router.
const router = express.Router();
router.use(express.urlencoded({ extended: false }));
router.use(express.json());
router.get('/', async (req, res, next) => {
try {
const search = req.query.search;
let query = db.findAllEmoji();
if (search) {
query = query.whereRaw('description LIKE ?', ['%' + search + '%']);
} else {
query = query.orderBy('emoji_id');
}
debug(`query length: ${query.length}`);
res.render('dashboard/dashboard-user', {
title: 'Dashboard - Emoji',
active: 'dashboard',
query,
});
} catch (err) {
next(err);
}
});
module.exports = router;
这是我正在建模的有效代码...也许我遗漏了一些明显的东西。
try {
const industry = req.query.industry;
const search = req.query.search;
const pageSize = parseInt(req.query.pageSize) || 10;
const pageNumber = parseInt(req.query.page) || 1;
const industryOptionList = {
selected: industry || '',
options: [
{ value: '', text: 'All Categories' },
{ value: 'hospitality', text: 'Hospitality' },
{ value: 'foodservice', text: 'Foodservice' },
{ value: 'IT', text: 'IT' },
{ value: 'defense', text: 'Defense' },
{ value: 'finance', text: 'Finance' },
{ value: 'construction', text: 'Construction' },
],
};
let query = db.getAllListings();
if (industry) {
query = query.where('company.industry', industry);
}
if (search) {
// query = query.whereRaw('MATCH (review.title, review.review_text) AGAINST (? IN NATURAL LANGUAGE MODE)', [search]);
query = query.whereRaw(
'listing_title LIKE ? OR company.industry LIKE ? OR company_name LIKE ? OR company_description LIKE ?',
['%' + search + '%', '%' + search + '%', '%' + search + '%', '%' + search + '%']
);
} else {
query = query.orderBy('posted_date');
}
const pager = await pagerUtils.getPager(query, pageSize, pageNumber, req.originalUrl);
const listings = await query.limit(pageSize).offset(pageSize * (pageNumber - 1));
debug(`listings length is ${listings.length}`);
if (!req.xhr) {
res.render('listing/listing-list', {
title: 'Jobify: Listings',
listings,
industry,
industryOptionList,
search,
pager,
});
} else {
res.render('listing/search-results', { listings, pager: pager, layout: null });
}
} catch (err) {
next(err);
}
});
这也是我的 ..db 代码,以防有帮助。
// get connection config
const config = require('config');
const { sum } = require('lodash');
const databaseConfig = config.get('db');
const debug = require('debug')('app:server');
//connect to the database
const knex = require('knex')({
client: 'mysql',
connection: databaseConfig,
});
const findAllEmoji = () => {
return knex('emoji')
.select('*');
};
module.exports = {
knex,
findAllEmoji,
};
如果您没有等待或调用查询构建器的 .then()
,查询只会被构建,但它永远不会被执行。
查询构建器的工作方式是您可以在不同的代码行中向查询添加更多 .where
、.join
等部分(就像您在 router.get('/', async (req, res, next) => {
中所做的那样)当查询准备就绪时,它需要被执行,这样它才会被发送到数据库服务器以获得响应。
我正在使用 node.js、MySQL、knex 和 express。
我正在做一个简单的数据库查询,db.findAllEmoji()。
const findAllEmoji = () => {
return knex('emoji')
.select('*');
};
我正在使用我正在建模的以前的代码工作,但仍然卡住了。下面有两个大代码块第一个来自我在 routes\dashboard.js
中呈现页面的路线。第二个是我正在建模的。
下面第一个大代码块 return 中的内容未定义,除非我使用 let query = await db.findAllEmoji();
,只有这样才会 return 查询结果。那很好,但是...如果我使用 await,则 .whereRaw 和 .orderBy 会抛出这些错误,而我无法克服这些错误。这是其中之一。
TypeError: query.orderBy is not a function at C:\Users\pauli\repos\all-coursework-node-paulwinka\tests. MySQL database schema emoji\routes\dashboard.js:21:21 at processTicksAndRejections (internal/process/task_queues.js:97:5)
我的示例代码不需要 await 才能工作,所以我更喜欢一个解决方案,它可以弄清楚为什么我的查询在没有 await 的情况下无法工作......或者也许。
所以我的问题是,为什么没有 await 原始查询就不能工作...我怎样才能像在我的模型代码中那样在没有 await 的情况下让它工作? 如果在这种情况下我必须使用 await,我该如何修复 orderBy 不起作用的错误?
我只用了几个星期,还在摸索中。谢谢。 :)
const express = require('express');
const db = require('../db');
const debug = require('debug')('app:routes:dashboard');
// creating instance of router.
const router = express.Router();
router.use(express.urlencoded({ extended: false }));
router.use(express.json());
router.get('/', async (req, res, next) => {
try {
const search = req.query.search;
let query = db.findAllEmoji();
if (search) {
query = query.whereRaw('description LIKE ?', ['%' + search + '%']);
} else {
query = query.orderBy('emoji_id');
}
debug(`query length: ${query.length}`);
res.render('dashboard/dashboard-user', {
title: 'Dashboard - Emoji',
active: 'dashboard',
query,
});
} catch (err) {
next(err);
}
});
module.exports = router;
这是我正在建模的有效代码...也许我遗漏了一些明显的东西。
try {
const industry = req.query.industry;
const search = req.query.search;
const pageSize = parseInt(req.query.pageSize) || 10;
const pageNumber = parseInt(req.query.page) || 1;
const industryOptionList = {
selected: industry || '',
options: [
{ value: '', text: 'All Categories' },
{ value: 'hospitality', text: 'Hospitality' },
{ value: 'foodservice', text: 'Foodservice' },
{ value: 'IT', text: 'IT' },
{ value: 'defense', text: 'Defense' },
{ value: 'finance', text: 'Finance' },
{ value: 'construction', text: 'Construction' },
],
};
let query = db.getAllListings();
if (industry) {
query = query.where('company.industry', industry);
}
if (search) {
// query = query.whereRaw('MATCH (review.title, review.review_text) AGAINST (? IN NATURAL LANGUAGE MODE)', [search]);
query = query.whereRaw(
'listing_title LIKE ? OR company.industry LIKE ? OR company_name LIKE ? OR company_description LIKE ?',
['%' + search + '%', '%' + search + '%', '%' + search + '%', '%' + search + '%']
);
} else {
query = query.orderBy('posted_date');
}
const pager = await pagerUtils.getPager(query, pageSize, pageNumber, req.originalUrl);
const listings = await query.limit(pageSize).offset(pageSize * (pageNumber - 1));
debug(`listings length is ${listings.length}`);
if (!req.xhr) {
res.render('listing/listing-list', {
title: 'Jobify: Listings',
listings,
industry,
industryOptionList,
search,
pager,
});
} else {
res.render('listing/search-results', { listings, pager: pager, layout: null });
}
} catch (err) {
next(err);
}
});
这也是我的 ..db 代码,以防有帮助。
// get connection config
const config = require('config');
const { sum } = require('lodash');
const databaseConfig = config.get('db');
const debug = require('debug')('app:server');
//connect to the database
const knex = require('knex')({
client: 'mysql',
connection: databaseConfig,
});
const findAllEmoji = () => {
return knex('emoji')
.select('*');
};
module.exports = {
knex,
findAllEmoji,
};
如果您没有等待或调用查询构建器的 .then()
,查询只会被构建,但它永远不会被执行。
查询构建器的工作方式是您可以在不同的代码行中向查询添加更多 .where
、.join
等部分(就像您在 router.get('/', async (req, res, next) => {
中所做的那样)当查询准备就绪时,它需要被执行,这样它才会被发送到数据库服务器以获得响应。