Search code examples
javascriptnode.jsjson-server

How to push objects to an array in json-server with a database generated in JS?


I have a json-server app running that generates the database on start dynamically with JS. The data I create is wrapped into a 'users' object as shown below:

{
    "users": [
        {
            "id": "user_id_0",
            "email": "Andy_Cummerata@hotmail.com",
            "first_name": "Consuelo",
            "last_name": "Labadie",
            "last_login_time": 1638643810,
            "role": "Manager"
        },
        {
            "id": "user_id_1",
            "email": "Ricardo_Jacobs45@yahoo.com",
            "first_name": "Albina",
            "last_name": "Nienow",
            "last_login_time": 1637479536,
            "role": "User"
        }
    ],
    "Page": 1,
    "PageSize": 10,
    "Total": 10
}

I want to be able to push a new user into that array. Because I render my response to wrap it, if I just use the native POST, the request simply fails. So I want to write my own function for, but I can't figure out how to access and modify my created database?

How can I create a function to send data to my dynamically generated database?

Below are the rest of my files, in case it's of any use.

File: db.js

var faker = require('faker');
var utils = require('../utils.js');
const users_created = 10

module.exports = function () {
    const data = { users: [] }

    for (var i = 0; i < users_created; i++) {
        data.users.push({
            id: "user_id_" + i,
            email: faker.internet.email(),
            first_name: faker.name.firstName(),
            last_name: faker.name.lastName(),
            last_login_time: utils.string_to_oom_epoch(faker.date.recent(days = 40).toISOString().replace('Z', '')),
            role: faker.helpers.randomize(['Admin', 'Manager', 'User'])
        })
    }

    return data;
}

File: server.js

const jsonServer = require('json-server');
const server = jsonServer.create()
const router = jsonServer.router(require('./db.js')())
const middlewares = jsonServer.defaults()

server.use(middlewares)
server.use(jsonServer.bodyParser)

router.render = (req, res) => {
    if (req.url.startsWith('/generic_users_list')) {
            page = parseInt(req.query.page)
    pageSize = parseInt(req.query.pagesize)
    filter_email = req.query.email

    users = res.locals.data.users
    if (filter_email !== undefined) {
        filtered_users = []
        for (var i = 0; i < users.length; i++)
            if (users[i].email.toLowerCase() == filter_email.toLowerCase())
                filtered_users.push(users[i])
        users = filtered_users
    }

    if (!isNaN(pageSize)) {
        res.jsonp({
            users: users.slice(page * pageSize, (page + 1) * pageSize),
            Page: page,
            PageSize: pageSize,
            Total: users.length
        })
    } else {
        res.jsonp({
            users: users,
            Page: 1,
            PageSize: users.length,
            Total: users.length
        })
    }
    } else {
        res.jsonp(res.locals.data)
    }
}

server.post('/generic_users_list', (req, res) => {
    new_user = {
        id: req.body.id,
        email: req.body.email,
        first_name: req.body.first_name,
        last_name: req.body.last_name,
        last_login_time: req.body.last_login_time,
        role: req.body.role
    }
    // WHAT DO I HAVE TO DO HERE TO ADD 'new_user' TO MY DATABASE?
})

server.use(router)

server.listen(port = 3000, () => {
    console.log("port")
    console.log('JSON Server is running')
    console.log('http://localhost:' + port)
})

Solution

  • You can extract the users array out of the export scope and define it as a constant. That way it lives in memory and you can add items to it. You just need to export another funtion, that may add a user to your in-memory database.

    var faker = require('faker');
    var utils = require('../utils.js');
    const users_created = 10
    
    const data = { users: [] }
    let next_id = users_created;
    
    function initDb() {
        for (var i = 0; i < users_created; i++) {
            data.users.push({
                id: "user_id_" + i,
                email: faker.internet.email(),
                first_name: faker.name.firstName(),
                last_name: faker.name.lastName(),
                last_login_time: utils.string_to_oom_epoch(faker.date.recent(days = 40).toISOString().replace('Z', '')),
                role: faker.helpers.randomize(['Admin', 'Manager', 'User'])
            })
        }
    
        return data;
    }
    
    function addUser(user) {
        user.id = "user_id_" + next_id++;
        data.users.push(user);
    }
    
    module.exports = {
        initDb,
        addUser,
        data
    }
    
    const jsonServer = require('json-server');
    const server = jsonServer.create()
    const user_db = require('./db.js')
    const middlewares = jsonServer.defaults()
    
    server.use(middlewares)
    server.use(jsonServer.bodyParser)
    
    user_db.initDb()
    const router = jsonServer.router(user_db.data)
    
    router.render = (req, res) => {
        if (req.url.startsWith('/generic_users_list')) {
                page = parseInt(req.query.page)
        pageSize = parseInt(req.query.pagesize)
        filter_email = req.query.email
    
        users = res.locals.data.users
        if (filter_email !== undefined) {
            filtered_users = []
            for (var i = 0; i < users.length; i++)
                if (users[i].email.toLowerCase() == filter_email.toLowerCase())
                    filtered_users.push(users[i])
            users = filtered_users
        }
    
        if (!isNaN(pageSize)) {
            res.jsonp({
                users: users.slice(page * pageSize, (page + 1) * pageSize),
                Page: page,
                PageSize: pageSize,
                Total: users.length
            })
        } else {
            res.jsonp({
                users: users,
                Page: 1,
                PageSize: users.length,
                Total: users.length
            })
        }
        } else {
            res.jsonp(res.locals.data)
        }
    }
    
    server.post('/generic_users_list', (req, res) => {
        new_user = {
            id: req.body.id,
            email: req.body.email,
            first_name: req.body.first_name,
            last_name: req.body.last_name,
            last_login_time: req.body.last_login_time,
            role: req.body.role
        }
        user_db.addUser(new_user)
    })
    
    server.use(router)
    
    server.listen(port = 3000, () => {
        console.log("port")
        console.log('JSON Server is running')
        console.log('http://localhost:' + port)
    })