0

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": "[email protected]",
            "first_name": "Consuelo",
            "last_name": "Labadie",
            "last_login_time": 1638643810,
            "role": "Manager"
        },
        {
            "id": "user_id_1",
            "email": "[email protected]",
            "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)
})

1 Answer 1

1

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)
})
Sign up to request clarification or add additional context in comments.

5 Comments

Not sure how this works, but trying to replicate your code I get: Error: Type of "initDb" (function) is not supported. Use objects or arrays of objects.
Where are you using the initDb function?
In the db.js file. Gets imported on server.js: const router = jsonServer.router(require('./db.js'))
In my code I export an object. You would need to require it in a variable and destructure it. I updated my answer to provide complete code.
I change my approach to building the database to yours and that solved my problem, thanks!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.