Javascript-форум (https://javascript.ru/forum/)
-   Node.JS (https://javascript.ru/forum/node-js-io-js/)
-   -   Как с помощью mongoose доставь коллекцию без метода find? (https://javascript.ru/forum/node-js-io-js/73905-kak-s-pomoshhyu-mongoose-dostav-kollekciyu-bez-metoda-find.html)

ками 27.05.2018 14:58

Как с помощью 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 возвращает совсем не объект коллекции!:-? :help:

EmperioAf 27.05.2018 19:13

Если вкратце, то никак. У 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));
});

Audaxviator 28.05.2018 10:00

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

ками 28.05.2018 13:54

Цитата:

Сообщение от Audaxviator (Сообщение 486128)
Вообще-то, весь код - бессмыслица.
Начиная с того, что метод 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 }

И где здесь хотя бы курсор вытащить непонятно:agree:

ками 28.05.2018 14:03

Цитата:

Сообщение от EmperioAf (Сообщение 486093)
Если вкратце, то никак. У 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
Как правильно реализовать данный код?:help:

Audaxviator 28.05.2018 14:27

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 14:47

Ну или так
app.get('/test', async (req, res) => {
	var data = await Account.findOne({token: 'no'});
	res.json(data);
});

ками 29.05.2018 11:26

Цитата:

Сообщение от Audaxviator (Сообщение 486154)
Ну или так
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);
});



Часовой пояс GMT +3, время: 04:15.