hapipal / boilerplate

A friendly, proven starting place for your next hapi plugin or deployment
https://hapipal.com
184 stars 26 forks source link

it's really not an issue but i need your help #33

Closed ghost closed 7 years ago

ghost commented 7 years ago

i am new in hapi and i really like your boilerplate api but i don't know how can i add plugin for example i want to add hapi-io plugin for socket and i should put this lines server.register({ register: require('hapi-io'), options: { ... } });

exports.register = function(server, options, next) {

var io = server.plugins['hapi-io'].io;

};

where should i put them

ghost commented 7 years ago

can you help me i really need your help @devinivy

wswoodruff commented 7 years ago

Hey @mostafa-raafat See how Dogwater is registered in server/manifest.js. You'll have to add your registration in the registrations array. Something like:

registrations: [
    {
        plugin: {
                register: 'hapi-io',
                options: {}
        }
    }
]
ghost commented 7 years ago

thank you @WilliamSWoodruff for reply i make it like you said but i get an error when i try to put

let io = server.plugins['hapi-io'].io;
    io.emit('connection', function (socket) {
        socket.emit('connected',"Welcome");
    });

in index.js file

let io = server.plugins['hapi-io'].io;
TypeError: Cannot read property 'io' of undefined
devinivy commented 7 years ago

The boilerplate is split between a plugin (in lib/) and a server (in server/) to deploy that plugin. If you'd like to register hapi-io in your plugin, simply add a file lib/plugins/hapi-io.js that exports options for hapi-io in the form { options: {/* hapi-io options */} }. haute-couture will then register that plugin for you, and you should be able to access server.plugins['hapi-io'] inside haute-couture's callback in lib/index.js. If you'd like to register hapi-io to your server as @WilliamSWoodruff indicated, I would suggest using server.dependency() (with a callback) within your plugin to ensure hapi-io has been registered before you try to access server.plugins['hapi-io'].

ghost commented 7 years ago

what i want to make to say on connection emit connected and on add user for example make some thing that's all

routes/user.js look like this

'use strict';
const Joi = require('joi');
const Boom = require('boom');

let addedUser = false;
let userList = [];

module.exports = [
    {
        method: 'get',
        path: '/user',
        config: {
            tags: ['api'],
            plugins: {
                'hapi-io': 'get-users'
            },
            handler: (request, reply) => {
                let io = request.plugins['hapi-io'].io;
                let socket = request.plugins['hapi-io'].socket;
                if (socket) {
                    socket.emit('get-users', userList);
                }
                reply({success: true});
            }
        }
    },
    {
        method: 'post',
        path: '/user',
        config: {
            tags: ['api'],
            plugins: {
                'hapi-io': 'add-user'
            },
            validate: {
                payload: {
                    username: Joi.string().alphanum().min(3).max(30).required()
                }
            },
            handler: (request, reply) => {
                let io = request.plugins['hapi-io'].io;
                let socket = request.plugins['hapi-io'].socket;
                if (socket) {
                    if (addedUser) return;
                    addedUser = true;
                    socket.username = request.payload.username;
                    userList.push({username: request.payload.username});
                    socket.emit('login', {userList: userList});
                    socket.broadcast.emit('user-joined', {
                        username: request.payload.username
                    });
                }
                reply({success: true});
            }
        }
    },
    {
        method: 'delete',
        path: '/user',
        config: {
            tags: ['api'],
            plugins: {
                'hapi-io': 'disconnect'
            },
            handler: (request, reply) => {
                let io = request.plugins['hapi-io'].io;
                let socket = request.plugins['hapi-io'].socket;
                if (socket) {
                    if (addedUser) {
                        for (let i = 0; i < userList.length; i++) {
                            if (socket.username === userList[i].username) {
                                userList.splice(i, 1);
                            }
                        }
                        socket.broadcast.emit('user-left', {
                            username: socket.username
                        });
                    }
                }
                reply({success: true});
            }
        }
    },
];

index.js look like this

'use strict';

const Package = require('../package.json');
const HauteCouture = require('haute-couture')();

exports.register = (server, options, next) => {

    HauteCouture(server, options, (err) => {

        if (err) {
            return next(err);
        }

        let io = server.plugins['hapi-io'].io;
        io.emit('connection', function (socket) {
            socket.emit('connected',"Welcome");
        });

        next();
    });

};

exports.register.attributes = {
    pkg: Package
};

i think i did something wrong i get

socket.on(event, function(data, respond) {
             ^

TypeError: socket.on is not a function
    at /home/spider/Application/Hapi/boilerplate-api/node_modules/hapi-io/lib/routes.js:19:14
    at Array.forEach (native)
    at /home/spider/Application/Hapi/boilerplate-api/node_modules/hapi-io/lib/routes.js:15:12
    at Array.forEach (native)
    at module.exports (/home/spider/Application/Hapi/boilerplate-api/node_modules/hapi-io/lib/routes.js:8:16)
    at Namespace.<anonymous> (/home/spider/Application/Hapi/boilerplate-api/node_modules/hapi-io/lib/index.js:61:5)
    at emitOne (events.js:77:13)
    at Namespace.emit (events.js:169:7)
    at Namespace.emit (/home/spider/Application/Hapi/boilerplate-api/node_modules/hapi-io/node_modules/socket.io/lib/namespace.js:209:10)
    at Server.(anonymous function) [as emit] (/home/spider/Application/Hapi/boilerplate-api/node_modules/hapi-io/node_modules/socket.io/lib/index.js:425:29)
    at /home/spider/Application/Hapi/boilerplate-api/lib/index.js:15:12
    at done (/home/spider/Application/Hapi/boilerplate-api/node_modules/haute-couture/node_modules/haute/node_modules/items/lib/index.js:31:25)
    at /home/spider/Application/Hapi/boilerplate-api/node_modules/haute-couture/node_modules/haute/lib/index.js:133:17
    at iterate (/home/spider/Application/Hapi/boilerplate-api/node_modules/haute-couture/node_modules/haute/node_modules/items/lib/index.js:36:13)
    at done (/home/spider/Application/Hapi/boilerplate-api/node_modules/haute-couture/node_modules/haute/node_modules/items/lib/index.js:28:25)
    at /home/spider/Application/Hapi/boilerplate-api/node_modules/haute-couture/node_modules/haute/lib/index.js:133:17
devinivy commented 7 years ago

That seems to be an issue with hapi-io or the way you're using it, which I don't know much about– sorry, don't think we can help you with that!