Ответы пользователя по тегу Express.js
  • Как получить имя параметра маршрута Express?

    @rustler2000
    погромист сикраш
    Кароче вопрос простой без балды.
    Вот кусок кода стыриный с кейса в expressjs и их доки.

    Суть, что перед запуском сервера, проходит по обработчикам и вставляет передними трамплин.

    const express = require('express')
    const app = express()
    
    app.get('/path/:id', function(req, res, next) {
        res.send(`${this.method} ${this.path}`)
    })
    
    function print (path, layer) {
      if (layer.route) {
        layer.route.stack.forEach(print.bind(null, path.concat(split(layer.route.path))))
      } else if (layer.name === 'router' && layer.handle.stack) {
        layer.handle.stack.forEach(print.bind(null, path.concat(split(layer.regexp))))
      } else if (layer.method) {
        console.log('%s /%s',
          layer.method.toUpperCase(),
          path.concat(split(layer.regexp)).filter(Boolean).join('/'))
          
        // 
        // Аттачим хэндлеру this :D
        // 
        const m = layer.method.toUpperCase()
        const p = path.concat(split(layer.regexp)).filter(Boolean).join('/')
        const fn = layer.handle
        layer.handle = function trampoline() {
            const self = {
                method: m,
                path: p
            }
            
            fn.apply(self, arguments)
        }
      }
    }
    
    function split (thing) {
      if (typeof thing === 'string') {
        return thing.split('/')
      } else if (thing.fast_slash) {
        return ''
      } else {
        var match = thing.toString()
          .replace('\\/?', '')
          .replace('(?=\\/|$)', '$')
          .match(/^\/\^((?:\\[.*+?^${}()|[\]\\\/]|[^.*+?^${}()|[\]\\\/])*)\$\//)
        return match
          ? match[1].replace(/\\(.)/g, '$1').split('/')
          : '<complex:' + thing.toString() + '>'
      }
    }
    app._router.stack.forEach(print.bind(null, []))
    
    app.listen(3000, () => console.log('Example app listening on port 3000!'))
    Ответ написан
  • Как правильно написать промежуточный обработчик?

    @rustler2000
    погромист сикраш
    app.use('/',function (req, res, next) { -> app.use(function (req, res, next) {
    Ответ написан
  • Как заставить expressjs обрабатывать одинаковые запросы одновременно?

    @rustler2000
    погромист сикраш
    Перед dispatcher.once поставь res.flushHeaders() - тогда и с табами работает )))

    Браузер не открывает следущего соединения пока с этим не все понятно. Наверное чтоб не ддосить
    Ответ написан
    3 комментария
  • Как правильно организовать маршрутизацию Express?

    @rustler2000
    погромист сикраш
    Не скажу как надо "точно".
    Но скажу как не надо.

    0. Не надо регистрировать медленные и редкоиспользуемые обработчики раньше чаще вызываемых и более критических. Но надо блюсти зависимости. Помните - роутер регистрирует обработчики в листе(ок - массиве) и вызывает последовательно, в том порядке - в котором они были зарегистрированны.

    1. Не надо ставить express-static/serve-static перед осовной логикой как советует dummyman (реальный ник). Выже не хотите, чтобы нода ходила на диск проверяя наличие файла каждый раз, даже когда надо всего лишь вернуть находящийся в памяти объект?

    2. Не надо упускать обработчики 404 и 500. А то клиенту будет больно, а вам чуднО.

    3. Не надо упускать, что nginx раздает статику офигенно быстро - ведь он использует sendfile тогда как нода будет
    читать с диска и писать в сокет по кускам.
    Не надо верить dummyman что nginx не умеет кэшировать статику.
    Не надо верить мне - освойте ab (можно и strace чтобы офигеть как круто работает nginx со статикой).

    4. Тут еще было про SO_REUSEPORT но это будет немного оффтопик.
    Ответ написан
  • Node.JS, Express. Одновременные запросы, требуется мнение. Как быть?

    @rustler2000
    погромист сикраш
    Физически не возможно принять два и более запроса одновременно.
    Физически не возможно в одном инстансе ноды одновременно их принять из сокета.
    Как правильно написали - в очередь, или базу точить (фактически база будет очередью).
    Ответ написан
    Комментировать
  • Можно ли сделать работу node асинхронной в данном случае?

    @rustler2000
    погромист сикраш
    Если дергать net-snmp через shell скрипт - то child_process.exec (см https://nodejs.org/api/child_process.html#child_pr... асинхронный. Предположу, что это через popen работает, хотя скорее всего там своя обертка, чтобы не мучаться с криво реализованными popen.

    Если же вообще net-snmp прямо из этогоже процесса, к примеру через С API, то лучше так не делать :D

    Если snmp чистый nodejs модуль, то 100%(ок - 99%) он асинхронен. Не нравиться callback hell - тогда promises или generators.
    Ответ написан
    2 комментария