Асинхронный вызов в режиме ожидания работает для nano.db.insert, но не для nano.db.list - PullRequest
1 голос
/ 22 апреля 2019

Я использую https://github.com/apache/couchdb-nano для взаимодействия с моим экземпляром couchdb в моем проекте nodeJS.

const nano = = require('nano')('http://127.0.0.1:5984');
const eventsDb = nano.db.use('events');
const savedEvent = await eventsDb.insert({title: 'ABC'});
console.log('savedEvent:');
console.log(savedEvent.body);

Вышеприведенное работает, но не работает (то есть регистрирует неопределенное):

const databases = await nano.db.list();
console.log(databases.body);
console.log(databases.rows);

и следующий печатает длинный след:

const databases = await nano.db.list();
console.log(databases);

Последний из приведенных выше печатает следующее:

Request {
  _events: [Object: null prototype] { pipe: [Function] },
  _eventsCount: 1,
  _maxListeners: undefined,
  method: 'GET',
  headers:
   { 'content-type': 'application/json',
     accept: 'application/json',
     host: '127.0.0.1:5984' },
  uri:
   Url {
     protocol: 'http:',
     slashes: true,
     auth: null,
     host: '127.0.0.1:5984',
     port: '5984',
     hostname: '127.0.0.1',
     hash: null,
     search: null,
     query: null,
     pathname: '/_all_dbs',
     path: '/_all_dbs',
     href: 'http://127.0.0.1:5984/_all_dbs' },
  readable: true,
  writable: true,
  explicitMethod: true,
  _qs:
   Querystring {
     request: [Circular],
     lib:
      { formats: [Object], parse: [Function], stringify: [Function] },
     useQuerystring: undefined,
     parseOptions: {},
     stringifyOptions: {} },
  _auth:
   Auth {
     request: [Circular],
     hasAuth: false,
     sentAuth: false,
     bearerToken: null,
     user: null,
     pass: null },
  _oauth: OAuth { request: [Circular], params: null },
  _multipart:
   Multipart {
     request: [Circular],
     boundary: '85e773c9-18a7-4dee-8564-776339438318',
     chunked: false,
     body: null },
  _redirect:
   Redirect {
     request: [Circular],
     followRedirect: true,
     followRedirects: true,
     followAllRedirects: false,
     followOriginalHttpMethod: false,
     allowRedirect: [Function],
     maxRedirects: 10,
     redirects: [],
     redirectsFollowed: 0,
     removeRefererHeader: false },
  _tunnel:
   Tunnel {
     request: [Circular],
     proxyHeaderWhiteList:
      [ 'accept',
        'accept-charset',
        'accept-encoding',
        'accept-language',
        'accept-ranges',
        'cache-control',
        'content-encoding',
        'content-language',
        'content-location',
        'content-md5',
        'content-range',
        'content-type',
        'connection',
        'date',
        'expect',
        'max-forwards',
        'pragma',
        'referer',
        'te',
        'user-agent',
        'via' ],
     proxyHeaderExclusiveList: [] },
  setHeader: [Function],
  hasHeader: [Function],
  getHeader: [Function],
  removeHeader: [Function],
  localAddress: undefined,
  pool: {},
  dests: [],
  __isRequestRequest: true,
  proxy: null,
  tunnel: false,
  setHost: true,
  originalCookieHeader: undefined,
  _disableCookies: true,
  _jar: false,
  port: '5984',
  host: '127.0.0.1',
  path: '/_all_dbs',
  httpModule:
   { _connectionListener: [Function: connectionListener],
     METHODS:
      [ 'ACL',
        'BIND',
        'CHECKOUT',
        'CONNECT',
        'COPY',
        'DELETE',
        'GET',
        'HEAD',
        'LINK',
        'LOCK',
        'M-SEARCH',
        'MERGE',
        'MKACTIVITY',
        'MKCALENDAR',
        'MKCOL',
        'MOVE',
        'NOTIFY',
        'OPTIONS',
        'PATCH',
        'POST',
        'PROPFIND',
        'PROPPATCH',
        'PURGE',
        'PUT',
        'REBIND',
        'REPORT',
        'SEARCH',
        'SOURCE',
        'SUBSCRIBE',
        'TRACE',
        'UNBIND',
        'UNLINK',
        'UNLOCK',
        'UNSUBSCRIBE' ],
     STATUS_CODES:
      { '100': 'Continue',
        '101': 'Switching Protocols',
        '102': 'Processing',
        '103': 'Early Hints',
        '200': 'OK',
        '201': 'Created',
        '202': 'Accepted',
        '203': 'Non-Authoritative Information',
        '204': 'No Content',
        '205': 'Reset Content',
        '206': 'Partial Content',
        '207': 'Multi-Status',
        '208': 'Already Reported',
        '226': 'IM Used',
        '300': 'Multiple Choices',
        '301': 'Moved Permanently',
        '302': 'Found',
        '303': 'See Other',
        '304': 'Not Modified',
        '305': 'Use Proxy',
        '307': 'Temporary Redirect',
        '308': 'Permanent Redirect',
        '400': 'Bad Request',
        '401': 'Unauthorized',
        '402': 'Payment Required',
        '403': 'Forbidden',
        '404': 'Not Found',
        '405': 'Method Not Allowed',
        '406': 'Not Acceptable',
        '407': 'Proxy Authentication Required',
        '408': 'Request Timeout',
        '409': 'Conflict',
        '410': 'Gone',
        '411': 'Length Required',
        '412': 'Precondition Failed',
        '413': 'Payload Too Large',
        '414': 'URI Too Long',
        '415': 'Unsupported Media Type',
        '416': 'Range Not Satisfiable',
        '417': 'Expectation Failed',
        '418': 'I\'m a Teapot',
        '421': 'Misdirected Request',
        '422': 'Unprocessable Entity',
        '423': 'Locked',
        '424': 'Failed Dependency',
        '425': 'Unordered Collection',
        '426': 'Upgrade Required',
        '428': 'Precondition Required',
        '429': 'Too Many Requests',
        '431': 'Request Header Fields Too Large',
        '451': 'Unavailable For Legal Reasons',
        '500': 'Internal Server Error',
        '501': 'Not Implemented',
        '502': 'Bad Gateway',
        '503': 'Service Unavailable',
        '504': 'Gateway Timeout',
        '505': 'HTTP Version Not Supported',
        '506': 'Variant Also Negotiates',
        '507': 'Insufficient Storage',
        '508': 'Loop Detected',
        '509': 'Bandwidth Limit Exceeded',
        '510': 'Not Extended',
        '511': 'Network Authentication Required' },
     Agent:
      { [Function: Agent] super_: [Function], defaultMaxSockets: Infinity },
     ClientRequest: { [Function: ClientRequest] super_: [Function] },
     globalAgent:
      Agent {
        _events: [Object],
        _eventsCount: 1,
        _maxListeners: undefined,
        defaultPort: 80,
        protocol: 'http:',
        options: [Object],
        requests: {},
        sockets: {},
        freeSockets: {},
        keepAliveMsecs: 1000,
        keepAlive: false,
        maxSockets: Infinity,
        maxFreeSockets: 256 },
     IncomingMessage: { [Function: IncomingMessage] super_: [Function] },
     OutgoingMessage: { [Function: OutgoingMessage] super_: [Function] },
     Server: { [Function: Server] super_: [Function] },
     ServerResponse: { [Function: ServerResponse] super_: [Function] },
     createServer: [Function: createServer],
     get: [Function: get],
     request: [Function: request],
     maxHeaderSize: [Getter] },
  agentClass:
   { [Function: Agent]
     super_:
      { [Function: EventEmitter]
        EventEmitter: [Circular],
        usingDomains: false,
        defaultMaxListeners: [Getter/Setter],
        init: [Function],
        listenerCount: [Function] },
     defaultMaxSockets: Infinity },
  agent:
   Agent {
     _events: [Object: null prototype] { free: [Function] },
     _eventsCount: 1,
     _maxListeners: undefined,
     defaultPort: 80,
     protocol: 'http:',
     options: { path: null },
     requests: {},
     sockets: {},
     freeSockets: {},
     keepAliveMsecs: 1000,
     keepAlive: false,
     maxSockets: Infinity,
     maxFreeSockets: 256 } }

Кто-нибудь может помочь?Все ли нано API работают в асинхронном / ожидающем стиле?

Ответы [ 2 ]

2 голосов
/ 24 апреля 2019

Последняя трассировка стека говорит мне, что вы получаете объект Request обратно в переменную databases. Это было поведение по умолчанию для Nano до версии 7.0.0.

Если вы используете последнюю версию Nano (v8.0.1 на момент написания), то большинство функций Nano возвращают Promise вместо объекта Request - это заставит ваш асинхронный / ожидающий код работать правильно, т.е. ваша переменная databases получит тело HTTP-запроса при разрешении Promise.

Чтобы убедиться, что в последней версии Nano используется npm install nano или измените файл package.json вашего проекта, чтобы убедиться, что запрошенный номер версии актуален перед запуском npm install.

0 голосов
/ 22 апреля 2019

Вы не можете использовать await таким образом, потому что await работает только внутри асинхронных функций. попробуйте следующее:

async function getDatabases() {
  const databases = await nano.db.list();
  console.log(databases.body);
  console.log(databases.rows);
}
getDatabases();

Посмотрите этот урок об асинхронном / ожидании, чтобы узнать больше Об асинхронном / ожидании

...