Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 27.05.2018, 14:58
Новичок на форуме
Отправить личное сообщение для ками Посмотреть профиль Найти все сообщения от ками
 
Регистрация: 26.05.2018
Сообщений: 8

Как с помощью mongoose доставь коллекцию без метода find?
Вот мой код:
Код:
const mongoose = require('mongoose');
const db = mongoose.connection;
var accountSchema = mongoose.Schema({
  token: String
});
accountSchema.methods.checkExist = function(token) {
	this.model('facebook').find({
		token: token
	}, function(err, result) {
		console.log(result);
	});
};
const Account = mongoose.model('facebook', accountSchema);

var test = new Account({
	token: 'testing'
});

test.checkExist(this.token);
Проблема в том что в команду find передаётся функция, а из этой функции до внешних переменных не достучатся. С объектом global тут решение не подходит, нужно сделать так чтобы result сразу можно было записать в массив и использовать вне метода find. Только так я смогу проверить существование аккаунта, поскольку надо вернуть true или false, а find возвращает совсем не объект коллекции!
Ответить с цитированием
  #2 (permalink)  
Старый 27.05.2018, 19:13
Аватар для EmperioAf
Профессор
Отправить личное сообщение для EmperioAf Посмотреть профиль Найти все сообщения от EmperioAf
 
Регистрация: 15.01.2015
Сообщений: 622

Если вкратце, то никак. У mongoose апи асинхронное. Вам надо работать с переменной result внутри callback и никак иначе.

Также mongoose согласно документации умеет в Promise. И можно писать примерно такой код:

app.get('/', async (req, res) {
   const data = await model.find({ name: 'john', age: { $gte: 18 }}).exec();
   res.send(JSON.stringify(data));
});
Ответить с цитированием
  #3 (permalink)  
Старый 28.05.2018, 10:00
Профессор
Отправить личное сообщение для Audaxviator Посмотреть профиль Найти все сообщения от Audaxviator
 
Регистрация: 28.04.2017
Сообщений: 214

Вообще-то, весь код - бессмыслица.
Начиная с того, что метод checkExist вообще не нужен (достаточно запросить findOne с токеном, и в колбек передастся либо документ, либо null - что и будет означать не-exist), и заканчивая тем, что внутрь создаваемого при модели собственного метода засовывается метод find - это как-то... не понятно что такое.

Последний раз редактировалось Audaxviator, 28.05.2018 в 10:11.
Ответить с цитированием
  #4 (permalink)  
Старый 28.05.2018, 13:54
Новичок на форуме
Отправить личное сообщение для ками Посмотреть профиль Найти все сообщения от ками
 
Регистрация: 26.05.2018
Сообщений: 8

Сообщение от Audaxviator Посмотреть сообщение
Вообще-то, весь код - бессмыслица.
Начиная с того, что метод checkExist вообще не нужен (достаточно запросить findOne с токеном, и в колбек передастся либо документ, либо null - что и будет означать не-exist), и заканчивая тем, что внутрь создаваемого при модели собственного метода засовывается метод find - это как-то... не понятно что такое.
С первым я уже разобрался, но вот второе никак.
Потому что когда я пробую так сделать:
Код:
console.log(Account.findOne({token: 'no'}));
Он выдаёт не null, а вот что:
Код:
Query {
  _mongooseOptions: {},
  mongooseCollection: 
   NativeCollection {
     collection: null,
     opts: 
      { bufferCommands: true,
        capped: false,
        '$wasForceClosed': undefined },
     name: 'facebook',
     collectionName: 'facebook',
     conn: 
      NativeConnection {
        base: [Mongoose],
        collections: [Object],
        models: [Object],
        config: [Object],
replica: false,
        options: null,
        otherDbs: [],
        relatedDbs: {},
        states: [Object],
        _readyState: 2,
        _closeCalled: false,
        _hasOpened: false,
        _listening: false,
        _connectionOptions: [Object],
        client: [MongoClient],
        name: 'accounts',
        '$initialConnection': [Promise],
        then: [Function],
        catch: [Function],
        _events: [Object],
        _eventsCount: 1 },
     queue: [],
     buffer: true,
     emitter: EventEmitter { _events: {}, _eventsCount: 0, _maxListeners: undefined } },
  model: 
   { [Function: model]
hooks: Kareem { _pres: [Object], _posts: [Object] },
     base: 
      Mongoose {
        connections: [Array],
        models: [Object],
        modelSchemas: [Object],
        options: [Object],
        _pluralize: [Function: pluralize],
        plugins: [Array] },
     modelName: 'facebook',
     model: [Function: model],
     db: 
      NativeConnection {
        base: [Mongoose],
        collections: [Object],
        models: [Object],
        config: [Object],
        replica: false,
        options: null,
        otherDbs: [],
        relatedDbs: {},
        states: [Object],
_readyState: 2,
        _closeCalled: false,
        _hasOpened: false,
        _listening: false,
        _connectionOptions: [Object],
        client: [MongoClient],
        name: 'accounts',
        '$initialConnection': [Promise],
        then: [Function],
        catch: [Function],
        _events: [Object],
        _eventsCount: 1 },
     discriminators: undefined,
     '$appliedMethods': true,
     '$appliedHooks': true,
     schema: 
      Schema {
        obj: [Object],
        paths: [Object],
        aliases: {},
        subpaths: {},
        virtuals: [Object],
singleNestedPaths: {},
        nested: {},
        inherits: {},
        callQueue: [],
        _indexes: [],
        methods: [Object],
        methodOptions: {},
        statics: {},
        tree: [Object],
        query: {},
        childSchemas: [],
        plugins: [Array],
        s: [Object],
        _userProvidedOptions: [Object],
        options: [Object],
        '$globalPluginsApplied': true,
        _requiredpaths: [] },
     collection: 
      NativeCollection {
        collection: null,
        opts: [Object],
        name: 'facebook',
collectionName: 'facebook',
        conn: [NativeConnection],
        queue: [],
        buffer: true,
        emitter: [EventEmitter] },
     Query: { [Function] base: [Query] },
     '$__insertMany': [Function],
     '$init': Promise { <pending>, catch: [Function] } },
  schema: 
   Schema {
     obj: { token: [Function: String] },
     paths: { token: [SchemaString], _id: [ObjectId], __v: [SchemaNumber] },
     aliases: {},
     subpaths: {},
     virtuals: { id: [VirtualType] },
     singleNestedPaths: {},
     nested: {},
     inherits: {},
     callQueue: [],
     _indexes: [],
     methods: { checkExist: [Function] },
     methodOptions: {},
statics: {},
     tree: 
      { token: [Function: String],
        _id: [Object],
        __v: [Function: Number],
        id: [VirtualType] },
     query: {},
     childSchemas: [],
     plugins: [ [Object], [Object], [Object], [Object], [Object] ],
     s: { hooks: [Kareem] },
     _userProvidedOptions: { collection: 'facebook' },
     options: 
      { collection: 'facebook',
        typeKey: 'type',
        id: true,
        noVirtualId: false,
        _id: true,
        noId: false,
        validateBeforeSave: true,
        read: null,
        shardKey: null,
        autoIndex: null,
minimize: true,
        discriminatorKey: '__t',
        versionKey: '__v',
        capped: false,
        bufferCommands: true,
        strict: true,
        pluralization: true },
     '$globalPluginsApplied': true,
     _requiredpaths: [] },
  op: 'findOne',
  options: {},
  _conditions: { token: 'no' },
  _fields: undefined,
  _update: undefined,
  _path: undefined,
  _distinct: undefined,
  _collection: 
   NodeCollection {
     collection: 
      NativeCollection {
        collection: null,
        opts: [Object],
name: 'facebook',
        collectionName: 'facebook',
        conn: [NativeConnection],
        queue: [],
        buffer: true,
        emitter: [EventEmitter] },
     collectionName: 'facebook' },
  _traceFunction: undefined }
И где здесь хотя бы курсор вытащить непонятно
Ответить с цитированием
  #5 (permalink)  
Старый 28.05.2018, 14:03
Новичок на форуме
Отправить личное сообщение для ками Посмотреть профиль Найти все сообщения от ками
 
Регистрация: 26.05.2018
Сообщений: 8

Сообщение от EmperioAf Посмотреть сообщение
Если вкратце, то никак. У mongoose апи асинхронное. Вам надо работать с переменной result внутри callback и никак иначе.

Также mongoose согласно документации умеет в Promise. И можно писать примерно такой код:

app.get('/', async (req, res) {
   const data = await model.find({ name: 'john', age: { $gte: 18 }}).exec();
   res.send(JSON.stringify(data));
});
Я изучил пока что только прочисы отсюда https://learn.javascript.ru/promise и код выдаёт ошибку:
Код:
app.get('/test', async (req, res) {
	const data = await Account.find({ num: 250 }).exec();
	res.send(JSON.stringify(data));
});
SyntaxError: missing ) after argument list после res
Как правильно реализовать данный код?
Ответить с цитированием
  #6 (permalink)  
Старый 28.05.2018, 14:27
Профессор
Отправить личное сообщение для Audaxviator Посмотреть профиль Найти все сообщения от Audaxviator
 
Регистрация: 28.04.2017
Сообщений: 214

Account.findOne({token: 'no'}).exec(function(err, doc) {
  console.log(doc);
});

или
Account.findOne({token: 'no'}, function(err, doc) {
  console.log(doc);
});

Последний раз редактировалось Audaxviator, 28.05.2018 в 16:58.
Ответить с цитированием
  #7 (permalink)  
Старый 28.05.2018, 14:47
Профессор
Отправить личное сообщение для Audaxviator Посмотреть профиль Найти все сообщения от Audaxviator
 
Регистрация: 28.04.2017
Сообщений: 214

Ну или так
app.get('/test', async (req, res) => {
	var data = await Account.findOne({token: 'no'});
	res.json(data);
});
Ответить с цитированием
  #8 (permalink)  
Старый 29.05.2018, 11:26
Новичок на форуме
Отправить личное сообщение для ками Посмотреть профиль Найти все сообщения от ками
 
Регистрация: 26.05.2018
Сообщений: 8

Сообщение от Audaxviator Посмотреть сообщение
Ну или так
app.get('/test', async (req, res) => {
	var data = await Account.findOne({token: 'no'});
	res.json(data);
});
Всё теперь работает, только вот в результате нельзя вывести ничего из полученного объекта:
Код:
app.get('/test', async (req, res) => {
	var data = await Account.findOne({token: 'no'});
	res.json(data); //в data token='no'
	console.log(data['token']);
	console.log(data.token);
});
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Управление скроллом "а-ля тач" HonesT Элементы интерфейса 2 27.08.2013 14:25
как с помощью jquery отсылать без перезагрузки... serhanters jQuery 11 22.07.2011 21:17
Как с помощью PHP сохранить какие-либо изменения в HTML документе? FirstFrost Работа 6 06.09.2010 16:16
Как с помощью PHP сохранить какие-либо изменения в HTML документе? FirstFrost Общие вопросы Javascript 1 15.07.2010 17:12
Подскажите как в VLC плеере переключать канал без перезагрузки страницы? mff Events/DOM/Window 0 10.05.2010 17:28